Setup

We will clean the environment, setup the locations, define colors, and create a datestamp.

Clean the environment.

Set locations and working directories…


Create a new analysis directory...
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] "/Users/swvanderlaan/PLINK/analyses/lookups/AE_20200512_COL_MKAVOUSI_MBOS_CHARGE_1000G_CAC"
 [1] "AE_20200512_COL_MKAVOUSI_MBOS_CHARGE_1000G_CAC.nb.html" "AE_20200512_COL_MKAVOUSI_MBOS_CHARGE_1000G_CAC.Rmd"    
 [3] "AE_20200512_COL_MKAVOUSI_MBOS_CHARGE_1000G_CAC.Rproj"   "bulkRNAseq"                                            
 [5] "CAC"                                                    "LICENSE"                                               
 [7] "README.html"                                            "README.md"                                             
 [9] "scRNAseq"                                               "SNP"                                                   
[11] "zipped_results"                                         "zipped_results.zip"                                    

… a package-installation function …

install.packages.auto <- function(x) { 
  x <- as.character(substitute(x)) 
  if (isTRUE(x %in% .packages(all.available = TRUE))) { 
    eval(parse(text = sprintf("require(\"%s\")", x)))
  } else { 
    # Update installed packages - this may mean a full upgrade of R, which in turn
    # may not be warrented. 
    #update.packages(ask = FALSE) 
    eval(parse(text = sprintf("install.packages(\"%s\", dependencies = TRUE, repos = \"http://cran-mirror.cs.uu.nl/\")", x)))
  }
  if (isTRUE(x %in% .packages(all.available = TRUE))) { 
    eval(parse(text = sprintf("require(\"%s\")", x)))
  } else {
    source("http://bioconductor.org/biocLite.R")
    # Update installed packages - this may mean a full upgrade of R, which in turn
    # may not be warrented.
    #biocLite(character(), ask = FALSE) 
    eval(parse(text = sprintf("biocLite(\"%s\")", x)))
    eval(parse(text = sprintf("require(\"%s\")", x)))
  }
}

… and load those packages.

install.packages.auto("readr")
install.packages.auto("optparse")
install.packages.auto("tools")
install.packages.auto("dplyr")
install.packages.auto("tidyr")
install.packages.auto("naniar")

# To get 'data.table' with 'fwrite' to be able to directly write gzipped-files
# Ref: https://stackoverflow.com/questions/42788401/is-possible-to-use-fwrite-from-data-table-with-gzfile
# install.packages("data.table", repos = "https://Rdatatable.gitlab.io/data.table")
library(data.table)

install.packages.auto("tidyverse")
install.packages.auto("knitr")
install.packages.auto("DT")
install.packages.auto("eeptools")

install.packages.auto("haven")
install.packages.auto("tableone")

install.packages.auto("BlandAltmanLeh")

# Install the devtools package from Hadley Wickham
install.packages.auto('devtools')

# for plotting
install.packages.auto("pheatmap")
install.packages.auto("forestplot")
install.packages.auto("ggplot2")

install.packages.auto("ggpubr")

install.packages.auto("UpSetR")

devtools::install_github("thomasp85/patchwork")
Skipping install of 'patchwork' from a github remote, the SHA1 (82a5e031) has not changed since last install.
  Use `force = TRUE` to force installation

We will create a datestamp and define the Utrecht Science Park Colour Scheme.


Today = format(as.Date(as.POSIXlt(Sys.time())), "%Y%m%d")
Today.Report = format(as.Date(as.POSIXlt(Sys.time())), "%A, %B %d, %Y")

### UtrechtScienceParkColoursScheme
###
### WebsitetoconvertHEXtoRGB:http://hex.colorrrs.com.
### Forsomefunctionsyoushoulddividethesenumbersby255.
###
### No. Color                 HEX   (RGB)                                     CHR         MAF/INFO
###---------------------------------------------------------------------------------------
### 1     yellow                #FBB820 (251,184,32)                      =>    1       or 1.0>INFO
### 2     gold                #F59D10 (245,157,16)                    =>    2       
### 3     salmon                #E55738 (229,87,56)                   =>    3       or 0.05<MAF<0.2 or 0.4<INFO<0.6
### 4     darkpink          #DB003F ((219,0,63)                   =>    4       
### 5     lightpink         #E35493 (227,84,147)                      =>    5       or 0.8<INFO<1.0
### 6     pink                #D5267B (213,38,123)                    =>    6       
### 7     hardpink          #CC0071 (204,0,113)                   =>    7       
### 8     lightpurple       #A8448A (168,68,138)                      =>    8       
### 9     purple                #9A3480 (154,52,128)                      =>    9       
### 10  lavendel            #8D5B9A (141,91,154)                      =>    10      
### 11  bluepurple        #705296 (112,82,150)                    =>    11      
### 12  purpleblue        #686AA9 (104,106,169)               =>    12      
### 13  lightpurpleblue #6173AD (97,115,173/101,120,180)    =>  13      
### 14  seablue             #4C81BF (76,129,191)                      =>    14      
### 15  skyblue             #2F8BC9 (47,139,201)                      =>    15      
### 16  azurblue            #1290D9 (18,144,217)                      =>    16      or 0.01<MAF<0.05 or 0.2<INFO<0.4
### 17  lightazurblue     #1396D8 (19,150,216)                    =>    17      
### 18  greenblue           #15A6C1 (21,166,193)                      =>    18      
### 19  seaweedgreen      #5EB17F (94,177,127)                    =>    19      
### 20  yellowgreen       #86B833 (134,184,51)                    =>    20      
### 21  lightmossgreen  #C5D220 (197,210,32)                      =>    21      
### 22  mossgreen           #9FC228 (159,194,40)                      =>    22      or MAF>0.20 or 0.6<INFO<0.8
### 23  lightgreen      #78B113 (120,177,19)                      =>    23/X
### 24  green                 #49A01D (73,160,29)                     =>    24/Y
### 25  grey                  #595A5C (89,90,92)                        =>  25/XY   or MAF<0.01 or 0.0<INFO<0.2
### 26  lightgrey           #A2A3A4 (162,163,164)                 =>    26/MT
###
### ADDITIONAL COLORS
### 27  midgrey         #D7D8D7
### 28  verylightgrey   #ECECEC"
### 29  white           #FFFFFF
### 30  black           #000000
###----------------------------------------------------------------------------------------------

uithof_color = c("#FBB820","#F59D10","#E55738","#DB003F","#E35493","#D5267B",
                 "#CC0071","#A8448A","#9A3480","#8D5B9A","#705296","#686AA9",
                 "#6173AD","#4C81BF","#2F8BC9","#1290D9","#1396D8","#15A6C1",
                 "#5EB17F","#86B833","#C5D220","#9FC228","#78B113","#49A01D",
                 "#595A5C","#A2A3A4", "#D7D8D7", "#ECECEC", "#FFFFFF", "#000000")

uithof_color_legend = c("#FBB820", "#F59D10", "#E55738", "#DB003F", "#E35493",
                        "#D5267B", "#CC0071", "#A8448A", "#9A3480", "#8D5B9A",
                        "#705296", "#686AA9", "#6173AD", "#4C81BF", "#2F8BC9",
                        "#1290D9", "#1396D8", "#15A6C1", "#5EB17F", "#86B833",
                        "#C5D220", "#9FC228", "#78B113", "#49A01D", "#595A5C",
                        "#A2A3A4", "#D7D8D7", "#ECECEC", "#FFFFFF", "#000000")
### ----------------------------------------------------------------------------

Introduction

Project details

Collaborators

Maryam Kavousi Patricia Peyser Maxime Bos

Project ID AE_20200512_COL_MKAVOUSI_MBOS_CHARGE_1000G_CAC

Background

Here we map the CHARGE Consortium 1000G GWAS on coronary artery calcification (CAC) susceptibility loci to the single-cell carotid plaque data. These are given in:

  • IndSigSNPsforSander.xlsx
  • GeneList_15042020.xlsx
library(openxlsx)

gene_list <- read.xlsx(paste0(TARGET_loc, "/GeneList_15042020.xlsx"))

variant_list <- read.xlsx(paste0(TARGET_loc, "/CandidateSNPsforSander.xlsx"))


DT::datatable(gene_list)


DT::datatable(variant_list)

NA

We will construct a list of genes to map to our scRNAseq data.


target_genes <- unlist(gene_list$symbol)
target_genes
 [1] "PHACTR1"      "EDN1"         "GFOD1"        "TBC1D7"       "ENPP1"        "ENPP3"        "IGFBP3"       "AC011294.3"   "C9orf53"     
[10] "CDKN2B"       "RP11-145E5.5" "CDKN2A"       "MTAP"         "AL137026.1"   "ZNF32"        "ZNF485"       "ARID5B"       "RTKN2"       
[19] "ADK"          "AP3M1"        "CAMK2G"       "COMTD1"       "DUPD1"        "DUSP13"       "KAT6B"        "SAMD8"        "VCL"         
[28] "VDAC2"        "FGF23"        "COL4A2"       "ADAMTS7"      "CHRNB4"       "MORF4L1"      "CHRNA5"       "CTSH"         "APOE"        
[37] "APOC1"        "BCAM"         "PVRL2"        "TOMM40"       "RPL9"         "C6orf195"     "C12orf4"      "COL4A1"       "CETP"        
[46] "SMG6"         "PLEKHJ1"     

We will test the hypothesis that CAC susceptibility loci are associated with plaque characteristics. We will use data from the Athero-Express Biobank Study.

Study design

We will perform regression analyses adjusted for age, sex (where applicable) and principal components.

Modeling

We will apply the following models:

model 1: phenotype ~ age + sex + chip-used + PC1 + PC2 + year-of-surgery

phenotypes are:

  • calcification, coded Calc.bin no/minor vs. moderate/heavy staining
  • collagen, coded Collagen.bin no/minor vs. moderate/heavy staining
  • fat10, coded Fat.bin_10 no/<10% fat vs. >10% fat
  • fat40, coded Fat.bin_40 no/<40% fat vs. >40% fat
  • intraplaque hemorrhage, coded IPH.bin no vs. yes
  • macrophages (CD68), coded macmean0 mean of computer-assisted calculation CD68+ region of interest
  • smooth muscle cells (alpha-actin), coded smcmean0 mean of computer-assisted calculation SMA+ region of interest
  • intraplaque vessel density (CD34), coded vessel_density manually counted CD34+ cells per 3-4 hotspots
  • mast cells, coded Mast_cells_plaque manually counted mast cell tryptase+ cells (https://academic.oup.com/eurheartj/article/34/48/3699/484981)
  • neutrophils (CD66b), coded neutrophils manually counted CD66b+ cells (https://pubmed.ncbi.nlm.nih.gov/20595650/)

Athero-Express Biobank Study

The Athero-Express Biobank Study (AE) contains plaque material of patients that underwent endarterectomyat two Dutch tertiary referral centers. Details of the study design were described before. Briefly, blood and plaque material were obtained during endarterectomy and stored at -80 ℃. Only carotid endarterectomy (CEA) patients were included in the present study. All patients provided informed consent and the study was approved by the medical ethics committee.

Athero-Express Genomics Study

DNA isolation and genotyping

We genotyped the AE in three separate, but consecutive experiments. In short, DNA was extracted from EDTA blood or (when no blood was available) plaque samples of 1,858 consecutive patients from the Athero-Express Biobank Study and genotyped in 3 batches.

For the Athero-Express Genomics Study 1 (AEGS1) 891 patients (602 males, 262 females, 27 unknown sex), included between 2002 and 2007, were genotyped (440,763 markers) using the Affymetrix Genome-Wide Human SNP Array 5.0 (SNP5) chip (Affymetrix Inc., Santa Clara, CA, USA) at Eurofins Genomics (formerly known as AROS).

For the Athero-Express Genomics Study 2 (AEGS2) 954 patients (640 makes, 313 females, 1 unknown sex), included between 2002 and 2013, were genotyped (587,351 markers) using the Affymetrix AxiomⓇ GW CEU 1 Array (AxM) at the Genome Analysis Center.

For the Athero-Express Genomics Study 3 (AEGS3) 658 patients (448 males, 203 females, 5 unknown sex), included between 2002 and 2016, were genotyped (693,931 markers) using the Illumina GSA MD v1 BeadArray (GSA) at Human Genomics Facility, HUGE-F.

All experiments were carried out according to OECD standards.

Genotyping calling

We used the genotyping calling algorithms as advised by Affymetrix (AEGS1 and AEGS2) and Illumina (AEGS3):

  • AEGS1: BRLMM-P
  • AEGS2: AxiomGT1
  • AEGS3: Illumina GenomeStudio

Quality control after genotyping

After genotype calling, we adhered to community standard quality control and assurance (QCA) procedures of the genotype data from AEGS1, AEGS2, and AEGS3. Samples with low average genotype calling and sex discrepancies (compared to the clinical data available) were excluded. The data was further filtered on:

  1. individual (sample) call rate > 97%,
  2. SNP call rate > 97%,
  3. minor allele frequencies (MAF) > 3%,
  4. average heterozygosity rate ± 3.0 s.d.,
  5. relatedness (pi-hat > 0.20),
  6. Hardy–Weinberg Equilibrium (HWE p < 1.0×10−3<>), and
  7. Monomorphic SNPs (< 1.0×10−6<>).

After QCA 2,493 samples remained, 108 of non-European descent/ancestry, and 156 related pairs. These comprise 890 samples and 407,712 SNPs in AEGS1, 869 samples and 534,508 SNPs in AEGS2, and 649954 samples and 534,508 SNPs in AEGS3 remained.

Imputation

Before phasing using SHAPEIT2, data was lifted to genome build b37 using the liftOver tool from UCSC (https://genome.ucsc.edu/cgi-bin/hgLiftOver). Finally, data was imputed with 1000G phase 3, version 5 and HRC release 1.1 as a reference using the Michigan Imputation Server. These results were further integrated using QCTOOL v2, where HRC imputed variants are given precendence over 1000G phase 3 imputed variants.

Quality control after imputation

We compared quality of the three AEGS datasets, and listed some variables of interest.

  • sample type (EDTA blood or plaque)
  • genotyping chip used
  • reason for filtering

We checked the studytype (AE or not), and identity-by-descent (IBD) within and between datasets to aid in sample mixups, duplicate sample use, and relatedness. In addition, during genotyping quality control samples were identified that deviated from Hardy-Weinberg Equilibrium (HWE), had discordance in sex-coding and genotype sex, and deviated from the principal component analysis (PCA) plot.

We will load the Athero-Express Biobank Study data, and all the samples that were send for genotyping and the final QC’ed sampleList.

Loading data

Loading Athero-Express Biobank Study clinical and biobank data, as well as the SampleList of genetic data.

cat("* get Athero-Express Biobank Study Database...")
* get Athero-Express Biobank Study Database...
# METHOD 1: It seems this method gives loads of errors and warnings, which all are hard to comprehend
#           or debug. We expect 3,527 samples, and 927 variables; we get 927 variables!!!
# AEdata = as.data.table(read.spss(paste0(INP_loc,"/2017-1NEW_AtheroExpressDatabase_ScientificAE_20171306_v1.0.sav"),
#                                  trim.factor.names = TRUE, trim_values = TRUE, # we trim spaces in values
#                                  reencode = TRUE, # we re-encode to the local locale encoding
#                                  add.undeclared.levels = "append", # we do *not* want to convert to R-factors
#                                  use.value.labels = FALSE, # we do *not* convert variables with value labels into R factors
#                                  use.missings = TRUE, sub = "NA", # we will set every missing variable to NA
#                                  duplicated.value.labels = "condense", # we will condense duplicated value labels
#                                  to.data.frame = TRUE))
# AEdata.labels <- as.data.table(attr(AEdata, "variable.labels"))
# names(AEdata.labels) <- "Variable"

# METHOD 2: Using library("haven") importing seems flawless; best argument being:
#           we expect 3,527 samples and 888 variables, which is what you'd get with this method
#           So for now, METHOD 2 is prefered. 
#            
require(haven)

# AEDB <- haven::read_sav(paste0(AEDB_loc, "/2019-3NEW_AtheroExpressDatabase_ScientificAE_02072019_IC_added.sav"))
AEDB <- haven::read_sav(paste0(AEDB_loc, "/2020_1_NEW_AtheroExpressDatabase_ScientificAE_16-03-2020.sav"))

# writing off the SPSS data to an Excel.
# fwrite(AEdata, file = paste0(INP_loc,"/2017-1NEW_AtheroExpressDatabase_ScientificAE_20171306_v1.0.values.xlsx"), 
#        sep = ";", na = "NA", dec = ".", col.names = TRUE, row.names = FALSE,
#        dateTimeAs = "ISO", showProgress = TRUE, verbose = TRUE)
# warnings()

AEDB[1:10, 1:10]
dim(AEDB)
[1] 3791 1091
cat("* get Athero-Express Genomics Study keys...")
* get Athero-Express Genomics Study keys...
AEGS123.sampleList.keytable <- fread(paste0(AEGSQC_loc, "/QC/SELECTIONS/20200319.QC.AEGS123.sampleList.keytable.txt"))

dim(AEGS123.sampleList.keytable)
[1] 2124   25
# AEGS123.sampleList.keytable[1:10, 1:10]

Examine AEDB

We can examine the contents of the Athero-Express Biobank dataset to know what each variable is called, what class (type) it has, and what the variable description is.

There is an excellent post on this: https://www.r-bloggers.com/working-with-spss-labels-in-r/.

AEDB %>% sjPlot::view_df(show.type = TRUE,
                         show.frq = TRUE,
                         show.prc = TRUE,
                         show.na = TRUE, 
                         max.len = TRUE, 
                         wrap.labels = 20,
                         verbose = FALSE, 
                         use.viewer = FALSE,
                         file = paste0(OUT_loc, "/", Today, ".AEDB.dictionary.html")) 
Following 3 variables have only missing values and are not shown:
yearpsy5 [326], yearchol3 [347], yearablo3 [419]

Fix clinical data

We need to be very strict in defining symptoms. Therefore we will fix a new variable that groups symptoms at inclusion.

Coding of symptoms is as follows:

  • missing -999
  • Asymptomatic 0
  • TIA 1
  • minor stroke 2
  • Major stroke 3
  • Amaurosis fugax 4
  • Four vessel disease 5
  • Vertebrobasilary TIA 7
  • Retinal infarction 8
  • Symptomatic, but aspecific symtoms 9
  • Contralateral symptomatic occlusion 10
  • retinal infarction 11
  • armclaudication due to occlusion subclavian artery, CEA needed for bypass 12
  • retinal infarction + TIAs 13
  • Ocular ischemic syndrome 14
  • ischemisch glaucoom 15
  • subclavian steal syndrome 16
  • TGA 17

We will group as follows:

  1. Asymptomatic > 0
  2. TIA > 1, 7, 13
  3. Stroke > 2, 3
  4. Ocular > 4, 14, 15
  5. Retinal infarction > 8, 11
  6. Other > 5, 9, 10, 12, 16, 17

# Fix symptoms

attach(AEDB)
AEDB[,"Symptoms.5G"] <- NA
AEDB$Symptoms.5G[sympt == 0] <- "Asymptomatic"
AEDB$Symptoms.5G[sympt == 1 | sympt == 7 | sympt == 13] <- "TIA"
AEDB$Symptoms.5G[sympt == 2 | sympt == 3] <- "Stroke"
AEDB$Symptoms.5G[sympt == 4 | sympt == 14 | sympt == 15 ] <- "Ocular"
AEDB$Symptoms.5G[sympt == 8 | sympt == 11] <- "Retinal infarction"
AEDB$Symptoms.5G[sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Other"


# AsymptSympt
AEDB[,"AsymptSympt"] <- NA
AEDB$AsymptSympt[sympt == -999] <- NA
AEDB$AsymptSympt[sympt == 0] <- "Asymptomatic"
AEDB$AsymptSympt[sympt == 1 | sympt == 7 | sympt == 13 | sympt == 2 | sympt == 3] <- "Symptomatic"
AEDB$AsymptSympt[sympt == 4 | sympt == 14 | sympt == 15 | sympt == 8 | sympt == 11 | sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Ocular and others"

# AsymptSympt
AEDB[,"AsymptSympt2G"] <- NA
AEDB$AsymptSympt2G[sympt == -999] <- NA
AEDB$AsymptSympt2G[sympt == 0] <- "Asymptomatic"
AEDB$AsymptSympt2G[sympt == 1 | sympt == 7 | sympt == 13 | sympt == 2 | sympt == 3 | sympt == 4 | sympt == 14 | sympt == 15 | sympt == 8 | sympt == 11 | sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Symptomatic"

detach(AEDB)

# table(AEDB$sympt, useNA = "ifany")
# table(AEDB$AsymptSympt2G, useNA = "ifany")
# table(AEDB$Symptoms.5G, useNA = "ifany")
# 
# table(AEDB$AsymptSympt2G, AEDB$sympt, useNA = "ifany")
# table(AEDB$Symptoms.5G, AEDB$sympt, useNA = "ifany")
table(AEDB$AsymptSympt2G, AEDB$Symptoms.5G, useNA = "ifany")
              
               Asymptomatic Ocular Other Retinal infarction Stroke  TIA <NA>
  Asymptomatic          333      0     0                  0      0    0    0
  Symptomatic             0    416   119                 43    732 1045    0
  <NA>                    0      0     0                  0      0    0 1103
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "sympt", "Symptoms.5G", "AsymptSympt"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# table(AEDB.temp$Symptoms.5G, AEDB.temp$AsymptSympt)
# 
# rm(AEDB.temp)

We will also fix the plaquephenotypes variable.

Coding of symptoms is as follows:

  • missing -999
  • not relevant -888
  • fibrous 1
  • fibroatheromatous 2
  • atheromatous 3

# Fix plaquephenotypes
attach(AEDB)
AEDB[,"OverallPlaquePhenotype"] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == -999] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == -999] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == 1] <- "fibrous"
AEDB$OverallPlaquePhenotype[plaquephenotype == 2] <- "fibroatheromatous"
AEDB$OverallPlaquePhenotype[plaquephenotype == 3] <- "atheromatous"
detach(AEDB)

# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "plaquephenotype", "OverallPlaquePhenotype"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the diabetes status variable.


# Fix diabetes
attach(AEDB)
AEDB[,"DiabetesStatus"] <- NA
AEDB$DiabetesStatus[DM.composite == -999] <- NA
AEDB$DiabetesStatus[DM.composite == 0] <- "Control (no Diabetes Dx/Med)"
AEDB$DiabetesStatus[DM.composite == 1] <- "Diabetes"
detach(AEDB)

# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "DM.composite", "DiabetesStatus"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$DiabetesStatus <- to_factor(AEDB.temp$DiabetesStatus)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the smoking status variable. We are interested in whether someone never, ever or is currently (at the time of inclusion) smoking. This is based on the questionnaire.

  • diet801: are you a smoker?
  • diet802: did you smoke in the past?

We already have some variables indicating smoking status:

  • SmokingReported: patient has reported to smoke.
  • SmokingYearOR: smoking in the year of surgery?
  • SmokerCurrent: currently smoking?
require(labelled)
Loading required package: labelled
AEDB$diet801 <- to_factor(AEDB$diet801)
AEDB$diet802 <- to_factor(AEDB$diet802)
AEDB$diet805 <- to_factor(AEDB$diet805)
AEDB$SmokingReported <- to_factor(AEDB$SmokingReported)
AEDB$SmokerCurrent <- to_factor(AEDB$SmokerCurrent)
AEDB$SmokingYearOR <- to_factor(AEDB$SmokingYearOR)

# table(AEDB$diet801)
# table(AEDB$diet802)
# table(AEDB$SmokingReported)
# table(AEDB$SmokerCurrent)
# table(AEDB$SmokingYearOR)
# table(AEDB$SmokingReported, AEDB$SmokerCurrent, useNA = "ifany", dnn = c("Reported smoking", "Current smoker"))
# 
# table(AEDB$diet801, AEDB$diet802, useNA = "ifany", dnn = c("Smoker", "Past smoker"))

cat("\nFixing smoking status.\n")

Fixing smoking status.
attach(AEDB)
AEDB[,"SmokerStatus"] <- NA
AEDB$SmokerStatus[diet802 == "don't know"] <- "Never smoked"
AEDB$SmokerStatus[diet802 == "I still smoke"] <- "Current smoker"
AEDB$SmokerStatus[SmokerCurrent == "no" & diet802 == "no"] <- "Never smoked"
AEDB$SmokerStatus[SmokerCurrent == "no" & diet802 == "yes"] <- "Ex-smoker"
AEDB$SmokerStatus[SmokerCurrent == "yes"] <- "Current smoker"
AEDB$SmokerStatus[SmokerCurrent == "no data available/missing"] <- NA
# AEDB$SmokerStatus[is.na(SmokerCurrent)] <- "Never smoked"
detach(AEDB)

cat("\n* Current smoking status.\n")

* Current smoking status.
table(AEDB$SmokerCurrent,
      useNA = "ifany", 
      dnn = c("Current smoker"))
Current smoker
no data available/missing                        no                       yes                      <NA> 
                        0                      2364                      1308                       119 
cat("\n* Updated smoking status.\n")

* Updated smoking status.
table(AEDB$SmokerStatus,
      useNA = "ifany", 
      dnn = c("Updated smoking status"))
Updated smoking status
Current smoker      Ex-smoker   Never smoked           <NA> 
          1308           1814            389            280 
cat("\n* Comparing to 'SmokerCurrent'.\n")

* Comparing to 'SmokerCurrent'.
table(AEDB$SmokerStatus, AEDB$SmokerCurrent, 
      useNA = "ifany", 
      dnn = c("Updated smoking status", "Current smoker"))
                      Current smoker
Updated smoking status no data available/missing   no  yes <NA>
        Current smoker                         0    0 1308    0
        Ex-smoker                              0 1814    0    0
        Never smoked                           0  389    0    0
        <NA>                                   0  161    0  119
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "DM.composite", "DiabetesStatus"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$DiabetesStatus <- to_factor(AEDB.temp$DiabetesStatus)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the alcohol status variable.


# Fix diabetes
attach(AEDB)
AEDB[,"AlcoholUse"] <- NA
AEDB$AlcoholUse[diet810 == -999] <- NA
AEDB$AlcoholUse[diet810 == 0] <- "No"
AEDB$AlcoholUse[diet810 == 1] <- "Yes"
detach(AEDB)

# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "diet810", "AlcoholUse"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$AlcoholUse <- to_factor(AEDB.temp$AlcoholUse)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix and inverse-rank normal transform the continuous (manually) scored plaque phenotypes.

AEDB$macmean0 <- as.numeric(AEDB$macmean0)
AEDB$smcmean0 <- as.numeric(AEDB$smcmean0)
AEDB$neutrophils <- as.numeric(AEDB$neutrophils)
AEDB$Mast_cells_plaque <- as.numeric(AEDB$Mast_cells_plaque)
AEDB$vessel_density_averaged <- as.numeric(AEDB$vessel_density_averaged)

AEDB$MAC_rankNorm <- qnorm((rank(AEDB$macmean0, na.last = "keep") - 0.5) / sum(!is.na(AEDB$macmean0)))
AEDB$SMC_rankNorm <- qnorm((rank(AEDB$smcmean0, na.last = "keep") - 0.5) / sum(!is.na(AEDB$smcmean0)))
AEDB$Neutrophils_rankNorm <- qnorm((rank(AEDB$neutrophils, na.last = "keep") - 0.5) / sum(!is.na(AEDB$neutrophils)))
AEDB$MastCells_rankNorm <- qnorm((rank(AEDB$Mast_cells_plaque, na.last = "keep") - 0.5) / sum(!is.na(AEDB$Mast_cells_plaque)))
AEDB$VesselDensity_rankNorm <- qnorm((rank(AEDB$vessel_density_averaged, na.last = "keep") - 0.5) / sum(!is.na(AEDB$vessel_density_averaged)))
library(labelled)
AEDB$Gender <- to_factor(AEDB$Gender)
ggpubr::gghistogram(AEDB, "macmean0", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "% of macrophages (CD68)",
                    xlab = "% per region of interest", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

ggpubr::gghistogram(AEDB, "MAC_rankNorm", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "% of macrophages (CD68)",
                   xlab = "% per region of interest\ninverse-rank normalized number", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

ggpubr::gghistogram(AEDB, "smcmean0", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "% of smooth muscle cells (SMA)",
                    xlab = "% per region of interest", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

ggpubr::gghistogram(AEDB, "SMC_rankNorm", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "% of smooth muscle cells (SMA)",
                   xlab = "% per region of interest\ninverse-rank normalized number", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

ggpubr::gghistogram(AEDB, "neutrophils", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "number of neutrophils (CD66b)",
                    xlab = "counts per plaque", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

ggpubr::gghistogram(AEDB, "Neutrophils_rankNorm", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "number of neutrophils (CD66b)",
                   xlab = "counts per plaque\ninverse-rank normalized number", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

ggpubr::gghistogram(AEDB, "Mast_cells_plaque", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "number of mast cells",
                    xlab = "counts per plaque", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

ggpubr::gghistogram(AEDB, "MastCells_rankNorm", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "number of mast cells",
                   xlab = "counts per plaque\ninverse-rank normalized number", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

ggpubr::gghistogram(AEDB, "vessel_density_averaged", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "number of intraplaque neovessels",
                    xlab = "counts per 3-4 hotspots", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

ggpubr::gghistogram(AEDB, "VesselDensity_rankNorm", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "number of intraplaque neovessels",
                   xlab = "counts per 3-4 hotspots\ninverse-rank normalized number", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

Here we calculate the plaque instability/vulnerability index

# Plaque vulnerability
require(labelled)
AEDB$Macrophages.bin <- to_factor(AEDB$Macrophages.bin)
AEDB$SMC.bin <- to_factor(AEDB$SMC.bin)
AEDB$IPH.bin <- to_factor(AEDB$IPH.bin)
AEDB$Calc.bin <- to_factor(AEDB$Calc.bin)
AEDB$Collagen.bin <- to_factor(AEDB$Collagen.bin)
AEDB$Fat.bin_10 <- to_factor(AEDB$Fat.bin_10)
AEDB$Fat.bin_40 <- to_factor(AEDB$Fat.bin_40)

table(AEDB$Macrophages.bin)

      no/minor moderate/heavy 
          1602           1215 
table(AEDB$Fat.bin_10)

 <10%  >10% 
 1226  1628 
table(AEDB$Collagen.bin)

      no/minor moderate/heavy 
           540           2297 
table(AEDB$SMC.bin)

      no/minor moderate/heavy 
           870           1962 
table(AEDB$IPH.bin)

  no  yes 
1223 1628 
# SPSS code

# 
# *** syntax- Plaque vulnerability**.
# COMPUTE Macro_instab = -999.
# IF macrophages.bin=2 Macro_instab=1.
# IF macrophages.bin=1 Macro_instab=0.
# EXECUTE.
# 
# COMPUTE Fat10_instab = -999.
# IF Fat.bin_10=2 Fat10_instab=1.
# IF Fat.bin_10=1 Fat10_instab=0.
# EXECUTE.
# 
# COMPUTE coll_instab=-999.
# IF Collagen.bin=2 coll_instab=0.
# IF Collagen.bin=1 coll_instab=1.
# EXECUTE.
# 
# 
# COMPUTE SMC_instab=-999.
# IF SMC.bin=2 SMC_instab=0.
# IF SMC.bin=1 SMC_instab=1.
# EXECUTE.
# 
# COMPUTE IPH_instab=-999.
# IF IPH.bin=0 IPH_instab=0.
# IF IPH.bin=1 IPH_instab=1.
# EXECUTE.
# 
# COMPUTE Instability=Macro_instab + Fat10_instab +  coll_instab + SMC_instab + IPH_instab.
# EXECUTE.

# Fix plaquephenotypes
attach(AEDB)
# mac instability
AEDB[,"MAC_Instability"] <- NA
AEDB$MAC_Instability[Macrophages.bin == -999] <- NA
AEDB$MAC_Instability[Macrophages.bin == "no/minor"] <- 0
AEDB$MAC_Instability[Macrophages.bin == "moderate/heavy"] <- 1

# fat instability
AEDB[,"FAT10_Instability"] <- NA
AEDB$FAT10_Instability[Fat.bin_10 == -999] <- NA
AEDB$FAT10_Instability[Fat.bin_10 == " <10%"] <- 0
AEDB$FAT10_Instability[Fat.bin_10 == " >10%"] <- 1

# col instability 
AEDB[,"COL_Instability"] <- NA
AEDB$COL_Instability[Collagen.bin == -999] <- NA
AEDB$COL_Instability[Collagen.bin == "no/minor"] <- 1
AEDB$COL_Instability[Collagen.bin == "moderate/heavy"] <- 0

# smc instability
AEDB[,"SMC_Instability"] <- NA
AEDB$SMC_Instability[SMC.bin == -999] <- NA
AEDB$SMC_Instability[SMC.bin == "no/minor"] <- 1
AEDB$SMC_Instability[SMC.bin == "moderate/heavy"] <- 0

# iph instability
AEDB[,"IPH_Instability"] <- NA
AEDB$IPH_Instability[IPH.bin == -999] <- NA
AEDB$IPH_Instability[IPH.bin == "no"] <- 0
AEDB$IPH_Instability[IPH.bin == "yes"] <- 1

detach(AEDB)

table(AEDB$MAC_Instability, useNA = "ifany")

   0    1 <NA> 
1602 1215  974 
table(AEDB$FAT10_Instability, useNA = "ifany")

   0    1 <NA> 
1226 1628  937 
table(AEDB$COL_Instability, useNA = "ifany")

   0    1 <NA> 
2297  540  954 
table(AEDB$SMC_Instability, useNA = "ifany")

   0    1 <NA> 
1962  870  959 
table(AEDB$IPH_Instability, useNA = "ifany")

   0    1 <NA> 
1223 1628  940 
# creating vulnerability index
AEDB <- AEDB %>% mutate(Plaque_Vulnerability_Index = factor(rowSums(.[grep("_Instability", names(.))], na.rm = TRUE)),
                                )

table(AEDB$Plaque_Vulnerability_Index, useNA = "ifany")

   0    1    2    3    4    5 
1324  655  728  676  298  110 
# str(AEDB$Plaque_Vulnerability_Index)

Prepare baseline characteristics

We are interested in the following variables at baseline.

  • Age (years)
  • Female sex (N, %)
  • Hypertension (N, %)
  • SBP (mmHg)
  • DBP (mmHg)
  • Diabetes mellitus (N, %)
  • Total cholesterol levels (mg/dL)
  • LDL cholesterol levels (mg/dL)
  • HDL cholesterol levels (mg/dL)
  • Triglyceride levels (mg/dL)
  • Use of statins (N, %)
  • Use of antiplatelet drugs (N, %)
  • BMI (kg/m²)
  • Smoking status (N, %)
    • Never smokers
    • Ex-smokers
    • Current smokers
  • History of CAD (N, %)
  • History of PAD (N, %)
  • Clinical manifestations
    • Asymptomatic
    • Amaurosis fugax
    • TIA
    • Stroke
  • eGFR (mL/min/1.73 m²)
  • stenosis
  • year of surgery
  • plaque characteristics
  • PCSK9

Fix things for CAC

For this project we also fix the CAC levels for analyses.

Measurement: This was measured in citrate plasma, at pg/mL using a LUMINEX assay.


# Fix hormones
attach(AEDB)
AEDB[,"Plasma_PCSK9"] <- NA
AEDB$Plasma_PCSK9 <- as.numeric(AEDB$PCSK9_plasma)
AEDB$Plasma_PCSK9[PCSK9_plasma == -999] <- NA
AEDB$Plasma_PCSK9[PCSK9_plasma == -888] <- NA
AEDB$Plasma_PCSK9[PCSK9_plasma == -777] <- NA
AEDB$Plasma_PCSK9[PCSK9_plasma == -666] <- NA

detach(AEDB)

AEDB$Plasma_PCSK9_rankNorm <- qnorm((rank(AEDB$PCSK9_plasma, na.last = "keep") - 0.5) / sum(!is.na(AEDB$PCSK9_plasma)))

AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "PCSK9_plasma", "Plasma_PCSK9", "Plasma_PCSK9_rankNorm"))
require(labelled)
AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)

DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)


rm(AEDB.temp)
library(labelled)
AEDB$Gender <- to_factor(AEDB$Gender)
AEDB$PCSK9_plasma <- as.numeric(AEDB$PCSK9_plasma)

ggpubr::gghistogram(AEDB, "Plasma_PCSK9", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median",
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "PCSK9 (citrate-plasma)",
                    xlab = "pg/mL", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

ggpubr::gghistogram(AEDB, "Plasma_PCSK9_rankNorm", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "PCSK9 (citrate-plasma)",
                    xlab = "pg/mL\ninverse-rank normalized", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

cat("====================================================================================================\n")
====================================================================================================
cat("SELECTION THE SHIZZLE\n")
SELECTION THE SHIZZLE
### Artery levels
# AEdata$Artery_summary: 
#           value                                                                                   label
# NOT USE - 0 No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA
# USE - 1                                                                  carotid (left & right)
# USE - 2                                               femoral/iliac (left, right or both sides)
# NOT USE - 3                                               other carotid arteries (common, external)
# NOT USE - 4                                   carotid bypass and injury (left, right or both sides)
# NOT USE - 5                                                         aneurysmata (carotid & femoral)
# NOT USE - 6                                                                                   aorta
# NOT USE - 7                                            other arteries (renal, popliteal, vertebral)
# NOT USE - 8                        femoral bypass, angioseal and injury (left, right or both sides)

### AEdata$informedconsent
#           value                                                                                           label
# NOT USE - -999                                                                                         missing
# NOT USE - 0                                                                                        no, died
# USE - 1                                                                                             yes
# USE - 2                                                             yes, health treatment when possible
# USE - 3                                                                        yes, no health treatment
# USE - 4                                                yes, no health treatment, no commercial business
# NOT USE - 5                                                          yes, no tissue, no commerical business
# NOT USE - 6                      yes, no tissue, no questionnaires, no medical info, no commercial business
# USE - 7                             yes, no questionnaires, no health treatment, no commercial business
# USE - 8                                          yes, no questionnaires, health treatment when possible
# NOT USE - 9                  yes, no tissue, no questionnaires, no health treatment, no commerical business
# USE - 10                               yes, no health treatment, no medical info, no commercial business
# NOT USE - 11 yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business
# USE - 12                                                     yes, no questionnaires, no health treatment
# NOT USE - 13                                                             yes, no tissue, no health treatment
# NOT USE - 14                                                               yes, no tissue, no questionnaires
# NOT USE - 15                                                  yes, no tissue, health treatment when possible
# NOT USE - 16                                                                                  yes, no tissue
# USE - 17                                                                     yes, no commerical business
# USE - 18                                     yes, health treatment when possible, no commercial business
# USE - 19                                                    yes, no medical info, no commercial business
# USE - 20                                                                          yes, no questionnaires
# NOT USE - 21                         yes, no tissue, no questionnaires, no health treatment, no medical info
# NOT USE - 22                  yes, no tissue, no questionnaires, no health treatment, no commercial business
# USE - 23                                                                            yes, no medical info
# USE - 24                                                  yes, no questionnaires, no commercial business
# USE - 25                                    yes, no questionnaires, no health treatment, no medical info
# USE - 26                  yes, no questionnaires, health treatment when possible, no commercial business
# USE - 27                                                      yes,  no health treatment, no medical info
# NOT USE - 28                                                                             no, doesn't want to
# NOT USE - 29                                                                              no, unable to sign
# NOT USE - 30                                                                                 no, no reaction
# NOT USE - 31                                                                                        no, lost
# NOT USE - 32                                                                                     no, too old
# NOT USE - 34                                            yes, no medical info, health treatment when possible
# NOT USE - 35                                             no (never asked for IC because there was no tissue)
# USE - 36                    yes, no medical info, no commercial business, health treatment when possible
# NOT USE - 37                                                                                    no, endpoint
# USE - 38                                                         wil niets invullen, wel alles gebruiken
# USE - 39                                           second informed concents: yes, no commercial business
# NOT USE - 40                                                                              nooit geincludeerd

cat("- sanity checking PRIOR to selection")
- sanity checking PRIOR to selection
library(data.table)
require(labelled)
ae.gender <- to_factor(AEDB$Gender)
ae.hospital <- to_factor(AEDB$Hospital)
table(ae.gender, ae.hospital, dnn = c("Sex", "Hospital"))
        Hospital
Sex      St. Antonius, Nieuwegein UMC Utrecht
  female                      524         636
  male                       1211        1420
ae.artery <- to_factor(AEDB$Artery_summary)
table(ae.artery, ae.gender, dnn = c("Sex", "Artery"))
                                                                                         Artery
Sex                                                                                       female male
  No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA      0    0
  carotid (left & right)                                                                     805 1781
  femoral/iliac (left, right or both sides)                                                  320  796
  other carotid arteries (common, external)                                                   17   35
  carotid bypass and injury (left, right or both sides)                                        6    3
  aneurysmata (carotid & femoral)                                                              1    0
  aorta                                                                                        3    5
  other arteries (renal, popliteal, vertebral)                                                 4    9
  femoral bypass, angioseal and injury (left, right or both sides)                             4    2
rm(ae.gender, ae.hospital, ae.artery)

# I change numeric and factors manually because, well, I wouldn't know how to fix it otherwise
# to have this 'tibble' work with 'tableone'... :-)

AEDB$Age <- as.numeric(AEDB$Age)
AEDB$diastoli <- as.numeric(AEDB$diastoli)
AEDB$systolic <- as.numeric(AEDB$systolic)

AEDB$TC_finalCU <- as.numeric(AEDB$TC_finalCU)
AEDB$LDL_finalCU <- as.numeric(AEDB$LDL_finalCU)
AEDB$HDL_finalCU <- as.numeric(AEDB$HDL_finalCU)
AEDB$TG_finalCU <- as.numeric(AEDB$TG_finalCU)

AEDB$TC_final <- as.numeric(AEDB$TC_final)
AEDB$LDL_final <- as.numeric(AEDB$LDL_final)
AEDB$HDL_final <- as.numeric(AEDB$HDL_final)
AEDB$TG_final <- as.numeric(AEDB$TG_final)

AEDB$Age <- as.numeric(AEDB$Age)
AEDB$GFR_MDRD <- as.numeric(AEDB$GFR_MDRD)
AEDB$BMI <- as.numeric(AEDB$BMI)
AEDB$eCigarettes <- as.numeric(AEDB$eCigarettes)
AEDB$ePackYearsSmoking <- as.numeric(AEDB$ePackYearsSmoking)
AEDB$EP_composite_time <- as.numeric(AEDB$EP_composite_time)
AEDB$EP_major_time <- as.numeric(AEDB$EP_major_time)

require(labelled)
AEDB$ORyear <- to_factor(AEDB$ORyear)
AEDB$Gender <- to_factor(AEDB$Gender)
AEDB$Hospital <- to_factor(AEDB$Hospital)
AEDB$KDOQI <- to_factor(AEDB$KDOQI)
AEDB$BMI_WHO <- to_factor(AEDB$BMI_WHO)
AEDB$DiabetesStatus <- to_factor(AEDB$DiabetesStatus)
AEDB$SmokerStatus <- to_factor(AEDB$SmokerStatus)
AEDB$AlcoholUse <- to_factor(AEDB$AlcoholUse)

AEDB$Hypertension.selfreport <- to_factor(AEDB$Hypertension1)
AEDB$Hypertension.selfreportdrug <- to_factor(AEDB$Hypertension2)
AEDB$Hypertension.composite <- to_factor(AEDB$Hypertension.composite)
AEDB$Hypertension.drugs <- to_factor(AEDB$Hypertension.drugs)

AEDB$Med.anticoagulants <- to_factor(AEDB$Med.anticoagulants)
AEDB$Med.all.antiplatelet <- to_factor(AEDB$Med.all.antiplatelet)
AEDB$Med.Statin.LLD <- to_factor(AEDB$Med.Statin.LLD)

AEDB$Stroke_Dx <- to_factor(AEDB$Stroke_Dx)
AEDB$CAD_history <- to_factor(AEDB$CAD_history)
AEDB$PAOD <- to_factor(AEDB$PAOD)
AEDB$Peripheral.interv <- to_factor(AEDB$Peripheral.interv)

AEDB$sympt <- to_factor(AEDB$sympt)
AEDB$Symptoms.3g <- to_factor(AEDB$Symptoms.3g)
AEDB$Symptoms.4g <- to_factor(AEDB$Symptoms.4g)
AEDB$Symptoms.5G <- to_factor(AEDB$Symptoms.5G)
AEDB$AsymptSympt <- to_factor(AEDB$AsymptSympt)
AEDB$AsymptSympt2G <- to_factor(AEDB$AsymptSympt2G)

AEDB$restenos <- to_factor(AEDB$restenos)
AEDB$stenose <- to_factor(AEDB$stenose)
AEDB$EP_composite <- to_factor(AEDB$EP_composite)
AEDB$EP_major <- to_factor(AEDB$EP_major)
AEDB$Macrophages.bin <- to_factor(AEDB$Macrophages.bin)
AEDB$SMC.bin <- to_factor(AEDB$SMC.bin)
AEDB$IPH.bin <- to_factor(AEDB$IPH.bin)
AEDB$Calc.bin <- to_factor(AEDB$Calc.bin)
AEDB$Collagen.bin <- to_factor(AEDB$Collagen.bin)
AEDB$Fat.bin_10 <- to_factor(AEDB$Fat.bin_10)
AEDB$Fat.bin_40 <- to_factor(AEDB$Fat.bin_40)
AEDB$OverallPlaquePhenotype <- to_factor(AEDB$OverallPlaquePhenotype)
AEDB$Plaque_Vulnerability_Index <- to_factor(AEDB$Plaque_Vulnerability_Index)

AEDB$Artery_summary <- to_factor(AEDB$Artery_summary)

AEDB$informedconsent <- to_factor(AEDB$informedconsent)

AEDB.CEA <- subset(AEDB,
                    (Artery_summary == "carotid (left & right)" | Artery_summary == "other carotid arteries (common, external)") & # we only want carotids
                       informedconsent != "missing" & # we are really strict in selecting based on 'informed consent'!
                       informedconsent != "no, died" &
                       informedconsent != "yes, no tissue, no commerical business" &
                       informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
                       informedconsent != "yes, no tissue, no health treatment" &
                       informedconsent != "yes, no tissue, no questionnaires" &
                       informedconsent != "yes, no tissue, health treatment when possible" &
                       informedconsent != "yes, no tissue" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
                       informedconsent != "no, doesn't want to" &
                       informedconsent != "no, unable to sign" &
                       informedconsent != "no, no reaction" &
                       informedconsent != "no, lost" &
                       informedconsent != "no, too old" &
                       informedconsent != "yes, no medical info, health treatment when possible" &
                       informedconsent != "no (never asked for IC because there was no tissue)" &
                       informedconsent != "no, endpoint" &
                       informedconsent != "nooit geincludeerd" & 
                     !is.na(AsymptSympt2G))
# AEDB.CEA[1:10, 1:10]
dim(AEDB.CEA)
[1] 2421 1113
AEDB.full <- subset(AEDB,
                    informedconsent != "missing" & # we are really strict in selecting based on 'informed consent'!
                       informedconsent != "no, died" &
                       informedconsent != "yes, no tissue, no commerical business" &
                       informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
                       informedconsent != "yes, no tissue, no health treatment" &
                       informedconsent != "yes, no tissue, no questionnaires" &
                       informedconsent != "yes, no tissue, health treatment when possible" &
                       informedconsent != "yes, no tissue" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
                       informedconsent != "no, doesn't want to" &
                       informedconsent != "no, unable to sign" &
                       informedconsent != "no, no reaction" &
                       informedconsent != "no, lost" &
                       informedconsent != "no, too old" &
                       informedconsent != "yes, no medical info, health treatment when possible" &
                       informedconsent != "no (never asked for IC because there was no tissue)" &
                       informedconsent != "no, endpoint" &
                       informedconsent != "nooit geincludeerd")
# AEDB.CEA[1:10, 1:10]
dim(AEDB.full)
[1] 3458 1113
cat("===========================================================================================\n")
===========================================================================================
cat("CREATE BASELINE TABLE\n")
CREATE BASELINE TABLE
# Baseline table variables
basetable_vars = c("Hospital", "ORyear",
                   "Age", "Gender", 
                   # "TC_finalCU", "LDL_finalCU", "HDL_finalCU", "TG_finalCU", 
                   "TC_final", "LDL_final", "HDL_final", "TG_final", 
                   # "hsCRP_plasma",
                   "systolic", "diastoli", "GFR_MDRD", "BMI", 
                   "KDOQI", "BMI_WHO",
                   "SmokerStatus", "AlcoholUse",
                   "DiabetesStatus", 
                   "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs", 
                   "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
                   "Stroke_Dx", "sympt", "Symptoms.5G", "AsymptSympt", "AsymptSympt2G",
                   "restenos", "stenose",
                   "CAD_history", "PAOD", "Peripheral.interv", 
                   "EP_composite", "EP_composite_time", "EP_major", "EP_major_time",
                   "MAC_rankNorm", "SMC_rankNorm", "Macrophages.bin", "SMC.bin",
                   "Neutrophils_rankNorm", "MastCells_rankNorm",
                   "IPH.bin", "VesselDensity_rankNorm",
                   "Calc.bin", "Collagen.bin", 
                   "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype", "Plaque_Vulnerability_Index",
                   "Plasma_PCSK9", "Plasma_PCSK9_rankNorm")

basetable_bin = c("Gender", 
                  "KDOQI", "BMI_WHO",
                  "SmokerStatus", "AlcoholUse",
                  "DiabetesStatus", 
                  "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs", 
                  "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
                  "Stroke_Dx", "sympt", "Symptoms.5G", "AsymptSympt", "AsymptSympt2G",
                  "restenos", "stenose",
                  "CAD_history", "PAOD", "Peripheral.interv", 
                  "EP_composite", "Macrophages.bin", "SMC.bin",
                  "IPH.bin", 
                  "Calc.bin", "Collagen.bin", 
                  "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype", "Plaque_Vulnerability_Index")
# basetable_bin

basetable_con = basetable_vars[!basetable_vars %in% basetable_bin]
# basetable_con

Athero-Express Biobank Study: baseline characteristics

Showing the baseline table of the whole Athero-Express Biobank.

# Create baseline tables
# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
AEDB.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                         # factorVars = basetable_bin,
                                         # strata = "Symptoms.4g",
                                         data = AEDB.full, includeNA = TRUE), 
                          nonnormal = c(), missing = TRUE,
                          quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE, 
                          format = "pf", 
                          contDigits = 3)[,1:3]
                                      
                                       level                                                                     Overall               Missing
  n                                                                                                                   3458                    
  Hospital % (freq)                    St. Antonius, Nieuwegein                                                       45.3 (1567)       0.0   
                                       UMC Utrecht                                                                    54.7 (1891)             
  ORyear % (freq)                      No data available/missing                                                       0.0 (   0)       0.0   
                                       2002                                                                            2.5 (  86)             
                                       2003                                                                            5.5 ( 191)             
                                       2004                                                                            7.7 ( 265)             
                                       2005                                                                            8.0 ( 276)             
                                       2006                                                                            7.3 ( 254)             
                                       2007                                                                            6.0 ( 206)             
                                       2008                                                                            5.5 ( 190)             
                                       2009                                                                            7.1 ( 246)             
                                       2010                                                                            8.0 ( 278)             
                                       2011                                                                            7.0 ( 243)             
                                       2012                                                                            8.2 ( 284)             
                                       2013                                                                            6.8 ( 235)             
                                       2014                                                                            8.1 ( 281)             
                                       2015                                                                            2.2 (  77)             
                                       2016                                                                            3.5 ( 121)             
                                       2017                                                                            2.3 (  79)             
                                       2018                                                                            2.2 (  77)             
                                       2019                                                                            2.0 (  69)             
  Age (mean (SD))                                                                                                   68.733 (9.214)      0.0   
  Gender % (freq)                      female                                                                         29.7 (1026)       0.0   
                                       male                                                                           70.3 (2432)             
  TC_final (mean (SD))                                                                                               4.769 (1.406)     45.9   
  LDL_final (mean (SD))                                                                                              2.762 (1.061)     53.6   
  HDL_final (mean (SD))                                                                                              1.207 (0.436)     50.2   
  TG_final (mean (SD))                                                                                               1.738 (1.099)     51.0   
  systolic (mean (SD))                                                                                             150.820 (24.992)    13.0   
  diastoli (mean (SD))                                                                                              80.072 (22.444)    13.0   
  GFR_MDRD (mean (SD))                                                                                              74.865 (24.412)     6.6   
  BMI (mean (SD))                                                                                                   26.395 (3.997)      5.8   
  KDOQI % (freq)                       No data available/missing                                                       0.0 (   0)       6.6   
                                       Normal kidney function                                                         21.7 ( 750)             
                                       CKD 2 (Mild)                                                                   47.9 (1656)             
                                       CKD 3 (Moderate)                                                               21.7 ( 750)             
                                       CKD 4 (Severe)                                                                  1.5 (  51)             
                                       CKD 5 (Failure)                                                                 0.6 (  22)             
                                       <NA>                                                                            6.6 ( 229)             
  BMI_WHO % (freq)                     No data available/missing                                                       0.0 (   0)       5.8   
                                       Underweight                                                                     1.1 (  37)             
                                       Normal                                                                         35.3 (1222)             
                                       Overweight                                                                     43.6 (1508)             
                                       Obese                                                                          14.1 ( 489)             
                                       <NA>                                                                            5.8 ( 202)             
  SmokerStatus % (freq)                Current smoker                                                                 34.3 (1187)       5.7   
                                       Ex-smoker                                                                      49.6 (1716)             
                                       Never smoked                                                                   10.4 ( 358)             
                                       <NA>                                                                            5.7 ( 197)             
  AlcoholUse % (freq)                  No                                                                             32.2 (1114)       4.1   
                                       Yes                                                                            63.7 (2203)             
                                       <NA>                                                                            4.1 ( 141)             
  DiabetesStatus % (freq)              Control (no Diabetes Dx/Med)                                                   73.3 (2534)       1.2   
                                       Diabetes                                                                       25.5 ( 883)             
                                       <NA>                                                                            1.2 (  41)             
  Hypertension.selfreport % (freq)     No data available/missing                                                       0.0 (   0)       3.6   
                                       no                                                                             23.7 ( 820)             
                                       yes                                                                            72.7 (2513)             
                                       <NA>                                                                            3.6 ( 125)             
  Hypertension.selfreportdrug % (freq) No data available/missing                                                       0.0 (   0)       5.0   
                                       no                                                                             29.0 (1002)             
                                       yes                                                                            66.0 (2284)             
                                       <NA>                                                                            5.0 ( 172)             
  Hypertension.composite % (freq)      No data available/missing                                                       0.0 (   0)       1.3   
                                       no                                                                             13.5 ( 466)             
                                       yes                                                                            85.2 (2947)             
                                       <NA>                                                                            1.3 (  45)             
  Hypertension.drugs % (freq)          No data available/missing                                                       0.0 (   0)       1.5   
                                       no                                                                             21.0 ( 725)             
                                       yes                                                                            77.5 (2681)             
                                       <NA>                                                                            1.5 (  52)             
  Med.anticoagulants % (freq)          No data available/missing                                                       0.0 (   0)       1.6   
                                       no                                                                             85.8 (2967)             
                                       yes                                                                            12.6 ( 434)             
                                       <NA>                                                                            1.6 (  57)             
  Med.all.antiplatelet % (freq)        No data available/missing                                                       0.0 (   0)       1.6   
                                       no                                                                             13.3 ( 459)             
                                       yes                                                                            85.1 (2943)             
                                       <NA>                                                                            1.6 (  56)             
  Med.Statin.LLD % (freq)              No data available/missing                                                       0.0 (   0)       1.5   
                                       no                                                                             21.0 ( 727)             
                                       yes                                                                            77.4 (2678)             
                                       <NA>                                                                            1.5 (  53)             
  Stroke_Dx % (freq)                   Missing                                                                         0.0 (   0)       7.5   
                                       No stroke diagnosed                                                            75.6 (2613)             
                                       Stroke diagnosed                                                               16.9 ( 586)             
                                       <NA>                                                                            7.5 ( 259)             
  sympt % (freq)                       missing                                                                         0.0 (   0)      28.3   
                                       Asymptomatic                                                                    9.1 ( 314)             
                                       TIA                                                                            28.0 ( 968)             
                                       minor stroke                                                                   11.8 ( 408)             
                                       Major stroke                                                                    6.9 ( 238)             
                                       Amaurosis fugax                                                                11.0 ( 380)             
                                       Four vessel disease                                                             1.1 (  39)             
                                       Vertebrobasilary TIA                                                            0.1 (   5)             
                                       Retinal infarction                                                              1.0 (  34)             
                                       Symptomatic, but aspecific symtoms                                              1.6 (  57)             
                                       Contralateral symptomatic occlusion                                             0.3 (  11)             
                                       retinal infarction                                                              0.2 (   6)             
                                       armclaudication due to occlusion subclavian artery, CEA needed for bypass       0.0 (   1)             
                                       retinal infarction + TIAs                                                       0.0 (   0)             
                                       Ocular ischemic syndrome                                                        0.5 (  16)             
                                       ischemisch glaucoom                                                             0.0 (   0)             
                                       subclavian steal syndrome                                                       0.1 (   2)             
                                       TGA                                                                             0.0 (   0)             
                                       <NA>                                                                           28.3 ( 979)             
  Symptoms.5G % (freq)                 Asymptomatic                                                                    9.1 ( 314)      28.3   
                                       Ocular                                                                         11.5 ( 396)             
                                       Other                                                                           3.2 ( 110)             
                                       Retinal infarction                                                              1.2 (  40)             
                                       Stroke                                                                         18.7 ( 646)             
                                       TIA                                                                            28.1 ( 973)             
                                       <NA>                                                                           28.3 ( 979)             
  AsymptSympt % (freq)                 Asymptomatic                                                                    9.1 ( 314)      28.3   
                                       Ocular and others                                                              15.8 ( 546)             
                                       Symptomatic                                                                    46.8 (1619)             
                                       <NA>                                                                           28.3 ( 979)             
  AsymptSympt2G % (freq)               Asymptomatic                                                                    9.1 ( 314)      28.3   
                                       Symptomatic                                                                    62.6 (2165)             
                                       <NA>                                                                           28.3 ( 979)             
  restenos % (freq)                    missing                                                                         0.0 (   0)       3.9   
                                       de novo                                                                        87.0 (3007)             
                                       restenosis                                                                      9.0 ( 312)             
                                       stenose bij angioseal na PTCA                                                   0.1 (   5)             
                                       <NA>                                                                            3.9 ( 134)             
  stenose % (freq)                     missing                                                                         0.0 (   0)       6.7   
                                       0-49%                                                                           0.7 (  23)             
                                       50-70%                                                                          6.9 ( 240)             
                                       70-90%                                                                         36.0 (1246)             
                                       90-99%                                                                         30.0 (1038)             
                                       100% (Occlusion)                                                               14.4 ( 497)             
                                       NA                                                                              0.1 (   3)             
                                       50-99%                                                                          2.5 (  86)             
                                       70-99%                                                                          2.7 (  93)             
                                       99                                                                              0.1 (   2)             
                                       <NA>                                                                            6.7 ( 230)             
  CAD_history % (freq)                 Missing                                                                         0.0 (   0)       2.0   
                                       No history CAD                                                                 64.1 (2216)             
                                       History CAD                                                                    33.9 (1173)             
                                       <NA>                                                                            2.0 (  69)             
  PAOD % (freq)                        missing/no data                                                                 0.0 (   0)       1.5   
                                       no                                                                             55.7 (1927)             
                                       yes                                                                            42.8 (1479)             
                                       <NA>                                                                            1.5 (  52)             
  Peripheral.interv % (freq)           no                                                                             68.0 (2352)       2.9   
                                       yes                                                                            29.1 (1006)             
                                       <NA>                                                                            2.9 ( 100)             
  EP_composite % (freq)                No data available.                                                              0.0 (   0)       5.1   
                                       No composite endpoints                                                         63.1 (2181)             
                                       Composite endpoints                                                            31.9 (1102)             
                                       <NA>                                                                            5.1 ( 175)             
  EP_composite_time (mean (SD))                                                                                      2.335 (1.166)      5.2   
  EP_major % (freq)                    No data available.                                                              0.0 (   0)       5.1   
                                       No major events (endpoints)                                                    83.3 (2882)             
                                       Major events (endpoints)                                                       11.6 ( 401)             
                                       <NA>                                                                            5.1 ( 175)             
  EP_major_time (mean (SD))                                                                                          2.735 (0.988)      5.2   
  MAC_rankNorm (mean (SD))                                                                                           0.004 (0.993)     32.9   
  SMC_rankNorm (mean (SD))                                                                                          -0.003 (1.004)     32.9   
  Macrophages.bin % (freq)             no/minor                                                                       41.6 (1437)      26.3   
                                       moderate/heavy                                                                 32.2 (1112)             
                                       <NA>                                                                           26.3 ( 909)             
  SMC.bin % (freq)                     no/minor                                                                       23.1 ( 799)      25.9   
                                       moderate/heavy                                                                 51.0 (1763)             
                                       <NA>                                                                           25.9 ( 896)             
  Neutrophils_rankNorm (mean (SD))                                                                                   0.010 (0.953)     91.0   
  MastCells_rankNorm (mean (SD))                                                                                    -0.009 (1.000)     93.0   
  IPH.bin % (freq)                     no                                                                             31.8 (1099)      25.3   
                                       yes                                                                            42.9 (1483)             
                                       <NA>                                                                           25.3 ( 876)             
  VesselDensity_rankNorm (mean (SD))                                                                                 0.017 (0.978)     48.3   
  Calc.bin % (freq)                    no/minor                                                                       38.0 (1314)      25.3   
                                       moderate/heavy                                                                 36.7 (1269)             
                                       <NA>                                                                           25.3 ( 875)             
  Collagen.bin % (freq)                no/minor                                                                       14.3 ( 496)      25.8   
                                       moderate/heavy                                                                 59.9 (2071)             
                                       <NA>                                                                           25.8 ( 891)             
  Fat.bin_10 % (freq)                   <10%                                                                          31.7 (1096)      25.3   
                                        >10%                                                                          43.0 (1488)             
                                       <NA>                                                                           25.3 ( 874)             
  Fat.bin_40 % (freq)                  <40%                                                                           59.5 (2056)      25.3   
                                       >40%                                                                           15.3 ( 528)             
                                       <NA>                                                                           25.3 ( 874)             
  OverallPlaquePhenotype % (freq)      atheromatous                                                                   14.7 ( 507)      25.9   
                                       fibroatheromatous                                                              22.2 ( 769)             
                                       fibrous                                                                        37.2 (1285)             
                                       <NA>                                                                           25.9 ( 897)             
  Plaque_Vulnerability_Index % (freq)  0                                                                              35.0 (1212)       0.0   
                                       1                                                                              17.1 ( 590)             
                                       2                                                                              19.0 ( 657)             
                                       3                                                                              18.0 ( 622)             
                                       4                                                                               8.0 ( 277)             
                                       5                                                                               2.9 ( 100)             
  Plasma_PCSK9 (mean (SD))                                                                                       31932.936 (18395.193) 59.2   
  Plasma_PCSK9_rankNorm (mean (SD))                                                                                 -0.002 (1.004)     59.2   
# Create baseline tables
# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
AEDB.CEA.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                         # factorVars = basetable_bin,
                                         # strata = "Symptoms.4g",
                                         data = AEDB.CEA, includeNA = TRUE), 
                          nonnormal = c(), missing = TRUE,
                          quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE, 
                          format = "pf", 
                          contDigits = 3)[,1:3]
                                      
                                       level                                                                     Overall               Missing
  n                                                                                                                   2421                    
  Hospital % (freq)                    St. Antonius, Nieuwegein                                                       39.2 ( 948)       0.0   
                                       UMC Utrecht                                                                    60.8 (1473)             
  ORyear % (freq)                      No data available/missing                                                       0.0 (   0)       0.0   
                                       2002                                                                            3.3 (  81)             
                                       2003                                                                            6.5 ( 157)             
                                       2004                                                                            7.8 ( 190)             
                                       2005                                                                            7.6 ( 185)             
                                       2006                                                                            7.6 ( 183)             
                                       2007                                                                            6.3 ( 152)             
                                       2008                                                                            5.7 ( 138)             
                                       2009                                                                            7.5 ( 181)             
                                       2010                                                                            6.6 ( 159)             
                                       2011                                                                            6.7 ( 163)             
                                       2012                                                                            7.3 ( 176)             
                                       2013                                                                            6.2 ( 149)             
                                       2014                                                                            6.7 ( 163)             
                                       2015                                                                            3.1 (  76)             
                                       2016                                                                            3.5 (  85)             
                                       2017                                                                            2.7 (  65)             
                                       2018                                                                            2.7 (  66)             
                                       2019                                                                            2.1 (  52)             
  Age (mean (SD))                                                                                                   69.105 (9.302)      0.0   
  Gender % (freq)                      female                                                                         30.5 ( 738)       0.0   
                                       male                                                                           69.5 (1683)             
  TC_final (mean (SD))                                                                                               4.786 (1.457)     38.0   
  LDL_final (mean (SD))                                                                                              2.808 (1.081)     45.6   
  HDL_final (mean (SD))                                                                                              1.203 (0.440)     41.7   
  TG_final (mean (SD))                                                                                               1.709 (1.031)     42.8   
  systolic (mean (SD))                                                                                             152.419 (25.166)    11.3   
  diastoli (mean (SD))                                                                                              81.318 (25.188)    11.3   
  GFR_MDRD (mean (SD))                                                                                              73.121 (21.152)     5.4   
  BMI (mean (SD))                                                                                                   26.488 (3.977)      5.9   
  KDOQI % (freq)                       No data available/missing                                                       0.0 (   0)       5.5   
                                       Normal kidney function                                                         19.1 ( 462)             
                                       CKD 2 (Mild)                                                                   50.9 (1232)             
                                       CKD 3 (Moderate)                                                               22.8 ( 553)             
                                       CKD 4 (Severe)                                                                  1.3 (  32)             
                                       CKD 5 (Failure)                                                                 0.4 (  10)             
                                       <NA>                                                                            5.5 ( 132)             
  BMI_WHO % (freq)                     No data available/missing                                                       0.0 (   0)       5.9   
                                       Underweight                                                                     1.0 (  24)             
                                       Normal                                                                         35.1 ( 850)             
                                       Overweight                                                                     43.4 (1051)             
                                       Obese                                                                          14.5 ( 352)             
                                       <NA>                                                                            5.9 ( 144)             
  SmokerStatus % (freq)                Current smoker                                                                 33.2 ( 803)       5.9   
                                       Ex-smoker                                                                      48.0 (1163)             
                                       Never smoked                                                                   12.9 ( 313)             
                                       <NA>                                                                            5.9 ( 142)             
  AlcoholUse % (freq)                  No                                                                             34.5 ( 835)       4.0   
                                       Yes                                                                            61.5 (1488)             
                                       <NA>                                                                            4.0 (  98)             
  DiabetesStatus % (freq)              Control (no Diabetes Dx/Med)                                                   75.2 (1820)       1.1   
                                       Diabetes                                                                       23.7 ( 574)             
                                       <NA>                                                                            1.1 (  27)             
  Hypertension.selfreport % (freq)     No data available/missing                                                       0.0 (   0)       3.2   
                                       no                                                                             24.3 ( 589)             
                                       yes                                                                            72.4 (1754)             
                                       <NA>                                                                            3.2 (  78)             
  Hypertension.selfreportdrug % (freq) No data available/missing                                                       0.0 (   0)       4.4   
                                       no                                                                             29.9 ( 725)             
                                       yes                                                                            65.6 (1589)             
                                       <NA>                                                                            4.4 ( 107)             
  Hypertension.composite % (freq)      No data available/missing                                                       0.0 (   0)       1.2   
                                       no                                                                             14.6 ( 353)             
                                       yes                                                                            84.3 (2040)             
                                       <NA>                                                                            1.2 (  28)             
  Hypertension.drugs % (freq)          No data available/missing                                                       0.0 (   0)       1.4   
                                       no                                                                             23.3 ( 565)             
                                       yes                                                                            75.3 (1823)             
                                       <NA>                                                                            1.4 (  33)             
  Med.anticoagulants % (freq)          No data available/missing                                                       0.0 (   0)       1.6   
                                       no                                                                             87.3 (2114)             
                                       yes                                                                            11.1 ( 269)             
                                       <NA>                                                                            1.6 (  38)             
  Med.all.antiplatelet % (freq)        No data available/missing                                                       0.0 (   0)       1.5   
                                       no                                                                             12.2 ( 295)             
                                       yes                                                                            86.3 (2090)             
                                       <NA>                                                                            1.5 (  36)             
  Med.Statin.LLD % (freq)              No data available/missing                                                       0.0 (   0)       1.4   
                                       no                                                                             20.3 ( 491)             
                                       yes                                                                            78.3 (1896)             
                                       <NA>                                                                            1.4 (  34)             
  Stroke_Dx % (freq)                   Missing                                                                         0.0 (   0)       6.9   
                                       No stroke diagnosed                                                            71.5 (1731)             
                                       Stroke diagnosed                                                               21.6 ( 524)             
                                       <NA>                                                                            6.9 ( 166)             
  sympt % (freq)                       missing                                                                         0.0 (   0)       0.0   
                                       Asymptomatic                                                                   11.2 ( 270)             
                                       TIA                                                                            39.7 ( 961)             
                                       minor stroke                                                                   16.8 ( 407)             
                                       Major stroke                                                                    9.8 ( 238)             
                                       Amaurosis fugax                                                                15.7 ( 379)             
                                       Four vessel disease                                                             1.6 (  38)             
                                       Vertebrobasilary TIA                                                            0.2 (   5)             
                                       Retinal infarction                                                              1.4 (  34)             
                                       Symptomatic, but aspecific symtoms                                              2.2 (  53)             
                                       Contralateral symptomatic occlusion                                             0.5 (  11)             
                                       retinal infarction                                                              0.2 (   6)             
                                       armclaudication due to occlusion subclavian artery, CEA needed for bypass       0.0 (   1)             
                                       retinal infarction + TIAs                                                       0.0 (   0)             
                                       Ocular ischemic syndrome                                                        0.7 (  16)             
                                       ischemisch glaucoom                                                             0.0 (   0)             
                                       subclavian steal syndrome                                                       0.1 (   2)             
                                       TGA                                                                             0.0 (   0)             
  Symptoms.5G % (freq)                 Asymptomatic                                                                   11.2 ( 270)       0.0   
                                       Ocular                                                                         16.3 ( 395)             
                                       Other                                                                           4.3 ( 105)             
                                       Retinal infarction                                                              1.7 (  40)             
                                       Stroke                                                                         26.6 ( 645)             
                                       TIA                                                                            39.9 ( 966)             
  AsymptSympt % (freq)                 Asymptomatic                                                                   11.2 ( 270)       0.0   
                                       Ocular and others                                                              22.3 ( 540)             
                                       Symptomatic                                                                    66.5 (1611)             
  AsymptSympt2G % (freq)               Asymptomatic                                                                   11.2 ( 270)       0.0   
                                       Symptomatic                                                                    88.8 (2151)             
  restenos % (freq)                    missing                                                                         0.0 (   0)       1.4   
                                       de novo                                                                        93.7 (2268)             
                                       restenosis                                                                      4.9 ( 118)             
                                       stenose bij angioseal na PTCA                                                   0.0 (   0)             
                                       <NA>                                                                            1.4 (  35)             
  stenose % (freq)                     missing                                                                         0.0 (   0)       2.0   
                                       0-49%                                                                           0.5 (  13)             
                                       50-70%                                                                          7.8 ( 189)             
                                       70-90%                                                                         46.6 (1127)             
                                       90-99%                                                                         38.3 ( 927)             
                                       100% (Occlusion)                                                                1.3 (  31)             
                                       NA                                                                              0.0 (   1)             
                                       50-99%                                                                          0.6 (  15)             
                                       70-99%                                                                          2.8 (  68)             
                                       99                                                                              0.1 (   2)             
                                       <NA>                                                                            2.0 (  48)             
  CAD_history % (freq)                 Missing                                                                         0.0 (   0)       1.9   
                                       No history CAD                                                                 66.8 (1618)             
                                       History CAD                                                                    31.2 ( 756)             
                                       <NA>                                                                            1.9 (  47)             
  PAOD % (freq)                        missing/no data                                                                 0.0 (   0)       2.0   
                                       no                                                                             77.5 (1876)             
                                       yes                                                                            20.5 ( 497)             
                                       <NA>                                                                            2.0 (  48)             
  Peripheral.interv % (freq)           no                                                                             77.2 (1868)       2.9   
                                       yes                                                                            19.9 ( 482)             
                                       <NA>                                                                            2.9 (  71)             
  EP_composite % (freq)                No data available.                                                              0.0 (   0)       5.0   
                                       No composite endpoints                                                         70.6 (1709)             
                                       Composite endpoints                                                            24.4 ( 590)             
                                       <NA>                                                                            5.0 ( 122)             
  EP_composite_time (mean (SD))                                                                                      2.479 (1.109)      5.2   
  EP_major % (freq)                    No data available.                                                              0.0 (   0)       5.0   
                                       No major events (endpoints)                                                    83.3 (2016)             
                                       Major events (endpoints)                                                       11.7 ( 283)             
                                       <NA>                                                                            5.0 ( 122)             
  EP_major_time (mean (SD))                                                                                          2.707 (0.977)      5.2   
  MAC_rankNorm (mean (SD))                                                                                           0.177 (0.952)     29.7   
  SMC_rankNorm (mean (SD))                                                                                          -0.060 (0.962)     29.9   
  Macrophages.bin % (freq)             no/minor                                                                       34.9 ( 846)      24.1   
                                       moderate/heavy                                                                 40.9 ( 991)             
                                       <NA>                                                                           24.1 ( 584)             
  SMC.bin % (freq)                     no/minor                                                                       24.9 ( 602)      23.8   
                                       moderate/heavy                                                                 51.3 (1242)             
                                       <NA>                                                                           23.8 ( 577)             
  Neutrophils_rankNorm (mean (SD))                                                                                   0.030 (0.951)     87.4   
  MastCells_rankNorm (mean (SD))                                                                                    -0.010 (1.002)     90.0   
  IPH.bin % (freq)                     no                                                                             30.7 ( 744)      23.5   
                                       yes                                                                            45.8 (1108)             
                                       <NA>                                                                           23.5 ( 569)             
  VesselDensity_rankNorm (mean (SD))                                                                                 0.056 (0.981)     35.1   
  Calc.bin % (freq)                    no/minor                                                                       41.6 (1006)      23.4   
                                       moderate/heavy                                                                 35.1 ( 849)             
                                       <NA>                                                                           23.4 ( 566)             
  Collagen.bin % (freq)                no/minor                                                                       15.8 ( 382)      23.6   
                                       moderate/heavy                                                                 60.6 (1467)             
                                       <NA>                                                                           23.6 ( 572)             
  Fat.bin_10 % (freq)                   <10%                                                                          22.4 ( 542)      23.3   
                                        >10%                                                                          54.3 (1314)             
                                       <NA>                                                                           23.3 ( 565)             
  Fat.bin_40 % (freq)                  <40%                                                                           56.2 (1360)      23.3   
                                       >40%                                                                           20.5 ( 496)             
                                       <NA>                                                                           23.3 ( 565)             
  OverallPlaquePhenotype % (freq)      atheromatous                                                                   19.8 ( 480)      23.7   
                                       fibroatheromatous                                                              27.8 ( 672)             
                                       fibrous                                                                        28.7 ( 695)             
                                       <NA>                                                                           23.7 ( 574)             
  Plaque_Vulnerability_Index % (freq)  0                                                                              29.5 ( 713)       0.0   
                                       1                                                                              14.3 ( 347)             
                                       2                                                                              19.7 ( 478)             
                                       3                                                                              22.1 ( 535)             
                                       4                                                                              10.4 ( 251)             
                                       5                                                                               4.0 (  97)             
  Plasma_PCSK9 (mean (SD))                                                                                       31967.258 (18888.894) 54.8   
  Plasma_PCSK9_rankNorm (mean (SD))                                                                                 -0.007 (1.016)     54.8   

Athero-Express Genomics Study: prepare

Let’s combine the full Athero-Express Biobank Study with the key-table containing the AEGS data.

NOTE: this should sum to 2,124 samples with genotypes.

AEGS <- merge(AEDB.full, AEGS123.sampleList.keytable, by.x = "STUDY_NUMBER", by.y = "STUDY_NUMBER", sort = FALSE,
                  all = TRUE)

dim(AEGS)
[1] 3571 1137
AEGS$UPID.y <- NULL
names(AEGS)[names(AEGS) == "UPID.x"] <- "UPID"
AEGS$Age.y <- NULL
names(AEGS)[names(AEGS) == "Age.x"] <- "Age"

table(AEGS$CHIP, useNA = "ifany")

AffyAxiomCEU     AffySNP5       IllGSA         <NA> 
         918          687          519         1447 
AEGS$GWAS <- AEGS$CHIP
AEGS$GWAS[is.na(AEGS$GWAS)] <- "not genotyped"
AEGS$GWAS[AEGS$GWAS != "not genotyped"] <- "genotyped"

table(AEGS$CHIP, AEGS$GWAS, useNA = "ifany")
              
               genotyped not genotyped
  AffyAxiomCEU       918             0
  AffySNP5           687             0
  IllGSA             519             0
  <NA>                 0          1447

Also a visualisation of the AEGS with AEDB overlaps.

library(UpSetR)
require(ggplot2)
require(plyr)
Loading required package: plyr
-------------------------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-------------------------------------------------------------------------------------------------------------------------------------------------

Attaching package: ‘plyr’

The following object is masked from ‘package:ggpubr’:

    mutate

The following object is masked from ‘package:purrr’:

    compact

The following objects are masked from ‘package:dplyr’:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
require(gridExtra)
Loading required package: gridExtra

Attaching package: ‘gridExtra’

The following object is masked from ‘package:dplyr’:

    combine
require(grid)

AEDB.availGWAS = list(
AEGS1 = subset(AEGS, CHIP == "AffySNP5", select = c("STUDY_NUMBER"))[,1],
AEGS2 = subset(AEGS, CHIP == "AffyAxiomCEU", select = c("STUDY_NUMBER"))[,1],
AEGS3 = subset(AEGS, CHIP == "IllGSA", select = c("STUDY_NUMBER"))[,1],
AEDB = AEGS$STUDY_NUMBER)

p1 <- UpSetR::upset(fromList(AEDB.availGWAS), 
                    sets = c("AEDB", "AEGS1", "AEGS2", "AEGS3"), 
                    main.bar.color = c(uithof_color[15], uithof_color[2], uithof_color[3], uithof_color[21]), 
                    mainbar.y.label = "intersection sample size", 
                    sets.bar.color = c(uithof_color[15], uithof_color[2], uithof_color[3], uithof_color[21]), 
                    sets.x.label = "sample size", keep.order = TRUE)
pdf(paste0(PLOT_loc, "/", Today, ".overlap.AEDB_AEGS123.UpSetR.pdf"))
  p1
dev.off()
quartz_off_screen 
                2 

p1

rm(p1)
table(AEGS$Artery_summary, AEGS$QC2018_FILTER)
                                                                                         
                                                                                          family_discard family_keep issue passed
  No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA              0           0     0      0
  carotid (left & right)                                                                              20          21    40   1819
  femoral/iliac (left, right or both sides)                                                            1           0     0     99
  other carotid arteries (common, external)                                                            0           0     0      9
  carotid bypass and injury (left, right or both sides)                                                0           0     0      1
  aneurysmata (carotid & femoral)                                                                      0           0     0      0
  aorta                                                                                                0           0     0      0
  other arteries (renal, popliteal, vertebral)                                                         0           0     0      1
  femoral bypass, angioseal and injury (left, right or both sides)                                     0           0     0      0
table(AEGS$informedconsent, AEGS$QC2018_FILTER)
                                                                                                 
                                                                                                  family_discard family_keep issue passed
  missing                                                                                                      0           0     0      0
  no, died                                                                                                     0           0     0      0
  yes                                                                                                         17          16    24   1411
  yes, health treatment when possible                                                                          2           2    10    312
  yes, no health treatment                                                                                     2           2     2     91
  yes, no health treatment, no commercial business                                                             0           0     0     15
  yes, no tissue, no commerical business                                                                       0           0     0      0
  yes, no tissue, no questionnaires, no medical info, no commercial business                                   0           0     0      0
  yes, no questionnaires, no health treatment, no commercial business                                          0           0     0      1
  yes, no questionnaires, health treatment when possible                                                       0           0     0      2
  yes, no tissue, no questionnaires, no health treatment, no commerical business                               0           0     0      0
  yes, no health treatment, no medical info, no commercial business                                            0           0     3     10
  yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business              0           0     0      0
  yes, no questionnaires, no health treatment                                                                  0           0     0      0
  yes, no tissue, no health treatment                                                                          0           0     0      0
  yes, no tissue, no questionnaires                                                                            0           0     0      0
  yes, no tissue, health treatment when possible                                                               0           0     0      0
  yes, no tissue                                                                                               0           0     0      0
  yes, no commerical business                                                                                  0           1     0     35
  yes, health treatment when possible, no commercial business                                                  0           0     0     25
  yes, no medical info, no commercial business                                                                 0           0     0      4
  yes, no questionnaires                                                                                       0           0     0      1
  yes, no tissue, no questionnaires, no health treatment, no medical info                                      0           0     0      0
  yes, no tissue, no questionnaires, no health treatment, no commercial business                               0           0     0      0
  yes, no medical info                                                                                         0           0     1      5
  yes, no questionnaires, no commercial business                                                               0           0     0      0
  yes, no questionnaires, no health treatment, no medical info                                                 0           0     0      1
  yes, no questionnaires, health treatment when possible, no commercial business                               0           0     0      0
  yes,  no health treatment, no medical info                                                                   0           0     0      5
  no, doesn't want to                                                                                          0           0     0      0
  no, unable to sign                                                                                           0           0     0      0
  no, no reaction                                                                                              0           0     0      0
  no, lost                                                                                                     0           0     0      0
  no, too old                                                                                                  0           0     0      0
  yes, no medical info, health treatment when possible                                                         0           0     0      0
  no (never asked for IC because there was no tissue)                                                          0           0     0      0
  yes, no medical info, no commercial business, health treatment when possible                                 0           0     0      2
  no, endpoint                                                                                                 0           0     0      0
  wil niets invullen, wel alles gebruiken                                                                      0           0     0      7
  second informed concents: yes, no commercial business                                                        0           0     0      2
  nooit geincludeerd                                                                                           0           0     0      0
AEGSselect <- subset(AEGS, 
                     informedconsent != "missing" &
                       informedconsent != "no, died" &
                       informedconsent != "yes, no tissue, no commerical business" &
                       informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
                       informedconsent != "yes, no tissue, no health treatment" &
                       informedconsent != "yes, no tissue, no questionnaires" &
                       informedconsent != "yes, no tissue, health treatment when possible" &
                       informedconsent != "yes, no tissue" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
                       informedconsent != "no, doesn't want to" &
                       informedconsent != "no, unable to sign" &
                       informedconsent != "no, no reaction" &
                       informedconsent != "no, lost" &
                       informedconsent != "no, too old" &
                       informedconsent != "yes, no medical info, health treatment when possible" &
                       informedconsent != "no (never asked for IC because there was no tissue)" &
                       informedconsent != "no, endpoint" &
                       informedconsent != "nooit geincludeerd")

AEGSselect.CEA <- subset(AEGS, !is.na(QC2018_FILTER) & QC2018_FILTER != "issue" & QC2018_FILTER != "family_discard" &
                     (Artery_summary == "carotid (left & right)" | Artery_summary == "other carotid arteries (common, external)") & # we only want carotids
                     informedconsent != "missing" &
                       informedconsent != "no, died" &
                       informedconsent != "yes, no tissue, no commerical business" &
                       informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
                       informedconsent != "yes, no tissue, no health treatment" &
                       informedconsent != "yes, no tissue, no questionnaires" &
                       informedconsent != "yes, no tissue, health treatment when possible" &
                       informedconsent != "yes, no tissue" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
                       informedconsent != "no, doesn't want to" &
                       informedconsent != "no, unable to sign" &
                       informedconsent != "no, no reaction" &
                       informedconsent != "no, lost" &
                       informedconsent != "no, too old" &
                       informedconsent != "yes, no medical info, health treatment when possible" &
                       informedconsent != "no (never asked for IC because there was no tissue)" &
                       informedconsent != "no, endpoint" &
                       informedconsent != "nooit geincludeerd")

dim(AEGSselect)
[1] 3458 1136
table(AEGSselect$Artery_summary, AEGSselect$QC2018_FILTER)
                                                                                         
                                                                                          family_discard family_keep issue passed
  No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA              0           0     0      0
  carotid (left & right)                                                                              20          21    40   1819
  femoral/iliac (left, right or both sides)                                                            1           0     0     99
  other carotid arteries (common, external)                                                            0           0     0      9
  carotid bypass and injury (left, right or both sides)                                                0           0     0      1
  aneurysmata (carotid & femoral)                                                                      0           0     0      0
  aorta                                                                                                0           0     0      0
  other arteries (renal, popliteal, vertebral)                                                         0           0     0      1
  femoral bypass, angioseal and injury (left, right or both sides)                                     0           0     0      0
table(AEGSselect$Artery_summary, AEGSselect$CHIP)
                                                                                         
                                                                                          AffyAxiomCEU AffySNP5 IllGSA
  No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA            0        0      0
  carotid (left & right)                                                                           863      550    487
  femoral/iliac (left, right or both sides)                                                          0       72     28
  other carotid arteries (common, external)                                                          2        5      2
  carotid bypass and injury (left, right or both sides)                                              0        1      0
  aneurysmata (carotid & femoral)                                                                    0        0      0
  aorta                                                                                              0        0      0
  other arteries (renal, popliteal, vertebral)                                                       0        1      0
  femoral bypass, angioseal and injury (left, right or both sides)                                   0        0      0
table(AEGSselect$QC2018_FILTER, AEGSselect$CHIP)
                
                 AffyAxiomCEU AffySNP5 IllGSA
  family_discard           12        6      3
  family_keep               8        1     12
  issue                    37        1      2
  passed                  808      621    500
table(AEGSselect$QC2018_FILTER, AEGSselect$SAMPLE_TYPE)
                
                 EDTA blood plaque unknown
  family_discard         15      6       0
  family_keep            13      8       0
  issue                  26     14       0
  passed               1199    729       1
AEDB.temp <- subset(AEGSselect,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "QC2018_FILTER", "CHIP", "SAMPLE_TYPE"))
require(labelled)
AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
AEDB.temp$QC2018_FILTER <- to_factor(AEDB.temp$QC2018_FILTER)
AEDB.temp$CHIP <- to_factor(AEDB.temp$CHIP)
AEDB.temp$SAMPLE_TYPE <- to_factor(AEDB.temp$SAMPLE_TYPE)

DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)


rm(AEDB.temp)

Athero-Express Genomics Study: baseline characteristics

Showing the baseline table of the Athero-Express Genomics Study.

# Create baseline tables
# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
AEGSselect$GWAS <- to_factor(AEGSselect$GWAS)
AEGSselect$CHIP <- to_factor(AEGSselect$CHIP)
AEGSselect$PCA <- to_factor(AEGSselect$PCA)
AEGSselect$SAMPLE_TYPE <- to_factor(AEGSselect$SAMPLE_TYPE)
AEGSselect$informedconsent <- to_factor(AEGSselect$informedconsent)

AEGSselect.CEA$GWAS <- to_factor(AEGSselect.CEA$GWAS)
AEGSselect.CEA$CHIP <- to_factor(AEGSselect.CEA$CHIP)
AEGSselect.CEA$PCA <- to_factor(AEGSselect.CEA$PCA)
AEGSselect.CEA$SAMPLE_TYPE <- to_factor(AEGSselect.CEA$SAMPLE_TYPE)
AEGSselect.CEA$informedconsent <- to_factor(AEGSselect.CEA$informedconsent)


cat("===========================================================================================\n")
===========================================================================================
cat("CREATE BASELINE TABLE\n")
CREATE BASELINE TABLE
# Baseline table variables
basetable_vars = c("Hospital", 
                   "Age", "Gender", 
                   "TC_final", "LDL_final", "HDL_final", "TG_final", 
                   "systolic", "diastoli", "GFR_MDRD", "BMI", 
                   "KDOQI", "BMI_WHO", 
                   "SmokerCurrent", "eCigarettes", "ePackYearsSmoking",
                   "DiabetesStatus", "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", 
                   "Hypertension.drugs", "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
                   "Stroke_Dx", "sympt", "Symptoms.5G", "restenos",
                   "EP_composite", "EP_composite_time",
                   "macmean0", "smcmean0", "Macrophages.bin", "SMC.bin", "neutrophils", "Mast_cells_plaque", "vessel_density_averaged",
                   "IPH.bin", 
                   "Calc.bin", "Collagen.bin", 
                   "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype", "Plaque_Vulnerability_Index",
                   "SMC_rankNorm", "MAC_rankNorm", "Neutrophils_rankNorm", "MastCells_rankNorm", "VesselDensity_rankNorm",
                  "GWAS", "CHIP", "PCA",
                  "Plasma_PCSK9", "Plasma_PCSK9_rankNorm")

basetable_bin = c("Gender", 
                  "KDOQI", "BMI_WHO", 
                  "SmokerCurrent", 
                  "DiabetesStatus", "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", 
                  "Hypertension.drugs", "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
                  "Stroke_Dx", "sympt", "Symptoms.5G", "restenos",
                  "EP_composite", "Macrophages.bin", "SMC.bin",
                  "IPH.bin", 
                  "Calc.bin", "Collagen.bin", 
                  "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype", "Plaque_Vulnerability_Index",
                  "GWAS", "CHIP", "PCA")

basetable_bin
 [1] "Gender"                      "KDOQI"                       "BMI_WHO"                     "SmokerCurrent"              
 [5] "DiabetesStatus"              "Hypertension.selfreport"     "Hypertension.selfreportdrug" "Hypertension.composite"     
 [9] "Hypertension.drugs"          "Med.anticoagulants"          "Med.all.antiplatelet"        "Med.Statin.LLD"             
[13] "Stroke_Dx"                   "sympt"                       "Symptoms.5G"                 "restenos"                   
[17] "EP_composite"                "Macrophages.bin"             "SMC.bin"                     "IPH.bin"                    
[21] "Calc.bin"                    "Collagen.bin"                "Fat.bin_10"                  "Fat.bin_40"                 
[25] "OverallPlaquePhenotype"      "Plaque_Vulnerability_Index"  "GWAS"                        "CHIP"                       
[29] "PCA"                        
basetable_con = basetable_vars[!basetable_vars %in% basetable_bin]
basetable_con
 [1] "Hospital"                "Age"                     "TC_final"                "LDL_final"               "HDL_final"              
 [6] "TG_final"                "systolic"                "diastoli"                "GFR_MDRD"                "BMI"                    
[11] "eCigarettes"             "ePackYearsSmoking"       "EP_composite_time"       "macmean0"                "smcmean0"               
[16] "neutrophils"             "Mast_cells_plaque"       "vessel_density_averaged" "SMC_rankNorm"            "MAC_rankNorm"           
[21] "Neutrophils_rankNorm"    "MastCells_rankNorm"      "VesselDensity_rankNorm"  "Plasma_PCSK9"            "Plasma_PCSK9_rankNorm"  

All Athero-Express Genomics Study data (n = 2,011), compared to the remaining, _un_genotyped Athero-Express Biobank Study.

cat("\n===========================================================================================\n")
cat("DISPLAY BASELINE TABLE\n")

AEGSselect.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                         # factorVars = basetable_bin,
                                         strata = "GWAS",
                                         data = AEGSselect, includeNA = TRUE), 
                          nonnormal = c(), missing = TRUE,
                          quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE, 
                          format = "pf", 
                          contDigits = 3)[,1:6]

Baseline of the valid, CEA and genotyped data.

AEGSselect.CEA.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                         # factorVars = basetable_bin,
                                         strata = "Gender",
                                         data = AEGSselect.CEA, includeNA = TRUE), 
                          nonnormal = c(), missing = TRUE,
                          quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE, 
                          format = "pf", 
                          contDigits = 3)[,1:6]

Athero-Express Genomics Study: writing

Let’s save the baseline characteristics of the Athero-Express Genomics Study.

# Write basetable
require(openxlsx)

write.xlsx(file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AEGS.BaselineTable.xlsx"), 
           AEGSselect.tableOne, 
           row.names = TRUE, 
           col.names = TRUE, 
           sheetName = "AEGS_Baseline")

write.xlsx(file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AEGS.CEA.BaselineTable.xlsx"), 
           AEGSselect.CEA.tableOne, 
           row.names = TRUE, 
           col.names = TRUE, 
           sheetName = "AEGS_Baseline_full")

SampleLists

Autosomal data.

We are ready to make a sampleList for use with the imputed data.

require(openxlsx)

temp <- subset(AEGS,
               GWAS == "genotyped",
               select = c("ID_1", "ID_2", "UPID", "STUDY_NUMBER", # ID_2 is the order of samples!
                          "QC2018_FINAL", "QC2018_FILTER", "OriginalOrder_postMichImp_QC",
                          "AEGS_type", "CHIP", "STUDY_TYPE", "SAMPLE_TYPE", "PCA",
                          "PC1", "PC2", "PC3", "PC4", "PC5",
                          "PC6", "PC7", "PC8", "PC9", "PC10",
                          "Sex", "Age", "ORyear", 
                          "Calc.bin", "Collagen.bin", 
                          "Fat.bin_10", "Fat.bin_40", "IPH.bin", 
                          "SMC_rankNorm", "MAC_rankNorm", "Neutrophils_rankNorm", "MastCells_rankNorm", "VesselDensity_rankNorm")) # Select some phenotype of interest
dim(temp)
[1] 2124   35
# Fix things
attach(temp)

temp[,"Calcification"] <- NA
temp$Calcification[Calc.bin == "no/minor"] <- "control"
temp$Calcification[Calc.bin == "moderate/heavy"] <- "case"

temp[,"Collagen"] <- NA
temp$Collagen[Collagen.bin == "no/minor"] <- "control"
temp$Collagen[Collagen.bin == "moderate/heavy"] <- "case"

temp[,"Fat10"] <- NA
temp$Fat10[Fat.bin_10 == "<10%"] <- "control"
temp$Fat10[Fat.bin_10 == ">10%"] <- "case"

temp[,"Fat40"] <- NA
temp$Fat40[Fat.bin_40 == "<40%"] <- "control"
temp$Fat40[Fat.bin_40 == ">40%"] <- "case"

temp[,"IPH"] <- NA
temp$IPH[IPH.bin == "no"] <- "control"
temp$IPH[IPH.bin == "yes"] <- "case"

detach(temp)

# Making selection variable
attach(temp)
temp[,"SELECTION"] <- "not_selected"
temp$SELECTION[(QC2018_FILTER=="passed" | QC2018_FILTER=="family_keep") & (STUDY_TYPE=="CEA" & PCA=="EUR")] <- "selected"
detach(temp)
table(temp$SELECTION, temp$QC2018_FILTER)
              
               family_discard family_keep issue passed
  not_selected             23           0    40    153
  selected                  0          21     0   1887
table(temp$SELECTION, temp$STUDY_TYPE)
              
                CEA  FEA Other
  not_selected   94  109    12
  selected     1908    0     0
table(temp$SELECTION, temp$PCA)
              
                EUR nonEUR
  not_selected  167     45
  selected     1908      0
AEGS123_sample.list <- temp[order(temp$OriginalOrder_postMichImp_QC),]

AEGS123_sample.list$missing <- 0

sample_file_aegs <- dplyr::select(AEGS123_sample.list,
                                  ID_1, ID_2, missing, # ID_2 is the order of samples - that way we always know what the order should be
                                  UPID, STUDY_NUMBER, 
                                  QC2018_FINAL, QC2018_FILTER, SELECTION,
                                  AEGS_type, CHIP, STUDY_TYPE, SAMPLE_TYPE, PCA,
                                  PC1, PC2, PC3, PC4, PC5, PC6, PC7, PC8, PC9, PC10,
                                  Sex, Age, ORyear, 
                                  Calcification, Collagen, 
                                  Fat10, Fat40, IPH, 
                                  SMC_rankNorm, MAC_rankNorm, Neutrophils_rankNorm, MastCells_rankNorm, VesselDensity_rankNorm)  %>%
  mutate_if(is.numeric, as.character) %>%
  mutate(SAMPLE_TYPE = gsub(' ', '_', SAMPLE_TYPE)) %>%
  add_row(.before = 1, 
          ID_1 = "0", ID_2 = "0", missing = "0", 
          UPID = "D", STUDY_NUMBER = "C",
          QC2018_FINAL = "D", QC2018_FILTER = "D", SELECTION = "D",
          AEGS_type = "D", CHIP = "D", STUDY_TYPE = "D", SAMPLE_TYPE = "D", PCA = "D",
          PC1 = "C", PC2 = "C", PC3 = "C", PC4 = "C", PC5 = "C", PC6 = "C", PC7 = "C", PC8 = "C", PC9 = "C", PC10 = "C",
          Sex = "D", Age = "C", ORyear = "C", 
          Calcification = "B", Collagen = "B", 
          Fat10 = "B", Fat40 = "B", IPH = "B", 
          SMC_rankNorm = "P", MAC_rankNorm = "P", Neutrophils_rankNorm = "P", MastCells_rankNorm = "P", VesselDensity_rankNorm = "P") %>% ## identifiers: index for these is 1, and all base variables have 0 as identifier
  print()
dim(sample_file_aegs)
[1] 2125   36
fwrite(sample_file_aegs,
       file = paste0(SNP_loc, "/",Today,".",PROJECTNAME,".AEGS123.sample"),
       na = "NA", sep = "\t", quote = FALSE,
       row.names = FALSE, col.names = TRUE,
       showProgress = TRUE, verbose = TRUE)
This installation of data.table has not been compiled with OpenMP support.
  omp_get_num_procs()            1
  R_DATATABLE_NUM_PROCS_PERCENT  unset (default 50)
  R_DATATABLE_NUM_THREADS        unset
  R_DATATABLE_THROTTLE           unset (default 1024)
  omp_get_thread_limit()         1
  omp_get_max_threads()          1
  OMP_THREAD_LIMIT               unset
  OMP_NUM_THREADS                unset
  RestoreAfterFork               true
  data.table is using 1 threads with throttle==1024. See ?setDTthreads.
No list columns are present. Setting sep2='' otherwise quote='auto' would quote fields containing sep2.
Column writers: 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 
args.doRowNames=0 args.rowNames=0 doQuote=0 args.nrow=2125 args.ncol=36 eolLen=1
maxLineLen=845. Found in 0.000s
Writing bom (false), yaml (0 characters) and column names (true) ... done in 0.001s
Writing 2125 rows in 1 batches of 2125 rows (each buffer size 8MB, showProgress=1, nth=1)
require(DT)
DT::datatable(sample_file_aegs, caption = "AEGS: final sample list of genotyped AE patients after quality control.", rownames = FALSE)
It seems your data is too big for client-side DataTables. You may consider server-side processing: https://rstudio.github.io/DT/server.htmlIt seems your data is too big for client-side DataTables. You may consider server-side processing: https://rstudio.github.io/DT/server.html

rm(temp, temp2, temp3)
object 'temp2' not foundobject 'temp3' not found

X-chromosome data

The X-chromosome data is taken from previously imputed data based on 1000G phase 3 (version 5) and GoNL5. For some reason, imputing on the Michigan Imputation Server was not successful (ACTION point).

Here we load in the sample files for the three datasets of the X chromosomal data. We should:

  • filter out samples that did not pass quality control, ending up with 2,124 sample
  • re-order the data to fit the other autosomal data.

AEGS123_chrX <- fread(paste0(MICHIMP_loc, "/_chr23_1kg_gonl5/aegs.raw.1kg_gonl5.chr23.mappings.txt"))
names(AEGS123_chrX)[names(AEGS123_chrX) == "ID_1"] <- "SampleID_postImpChrX"

AEGS123_AllChr <- merge(AEGS123_chrX, sample_file_aegs, by.x = "SampleID_postMichImp", by.y = "ID_1", 
                        all.x = TRUE, 
                        sort = FALSE)

names(AEGS123_AllChr)[names(AEGS123_AllChr) == "ID_2.y"] <- "ID_2"
names(AEGS123_AllChr)[names(AEGS123_AllChr) == "STUDY_TYPE.y"] <- "STUDY_TYPE"
names(AEGS123_AllChr)[names(AEGS123_AllChr) == "SampleID_postMichImp"] <- "ID_1"
AEGS123_AllChr$missing.x <- NULL
AEGS123_AllChr$missing.y <- NULL
AEGS123_AllChr$STUDY_TYPE.x <- NULL
AEGS123_AllChr$ID_2.x <- NULL

dim(AEGS123_AllChr)
[1] 2176   40
str(AEGS123_AllChr)
Classes ‘data.table’ and 'data.frame':  2176 obs. of  40 variables:
 $ ID_1                  : chr  "0" "UPID00126-UPID00126-A318-0034" "UPID01799-UPID01799-A318-0492" "UPID01890-UPID01890-A318-0151" ...
 $ SampleID_postImpChrX  : chr  "0" "UPID00126-UPID00126-A318-0034" "UPID01799-UPID01799-A318-0492" "UPID01890-UPID01890-A318-0151" ...
 $ MappingID             : chr  "0" "UPID00126-UPID00126-A318-0034" "UPID01799-UPID01799-A318-0492" "UPID01890-UPID01890-A318-0151" ...
 $ FID_forQC             : chr  "0" "UPID00126" "UPID01799" "UPID01890" ...
 $ IID_forQC             : chr  "0" "UPID00126-UPID00126-A318-0034" "UPID01799-UPID01799-A318-0492" "UPID01890-UPID01890-A318-0151" ...
 $ SampleID_postQC       : chr  "0" "UPID00126-UPID00126-A318-0034" "UPID01799-UPID01799-A318-0492" "UPID01890-UPID01890-A318-0151" ...
 $ ID_2                  : chr  "0" "22" "325" NA ...
 $ UPID                  : chr  "D" NA NA NA ...
 $ STUDY_NUMBER          : chr  "C" "901" "1164" NA ...
 $ QC2018_FINAL          : chr  "D" NA NA NA ...
 $ QC2018_FILTER         : chr  "D" "passed" "passed" NA ...
 $ SELECTION             : chr  "D" "selected" "selected" NA ...
 $ AEGS_type             : chr  "D" "AEGS1" "AEGS1" NA ...
 $ CHIP                  : chr  "D" "AffySNP5" "AffySNP5" NA ...
 $ STUDY_TYPE            : chr  "D" "CEA" "CEA" NA ...
 $ SAMPLE_TYPE           : chr  "D" "plaque" "plaque" NA ...
 $ PCA                   : chr  "D" "EUR" "EUR" NA ...
 $ PC1                   : chr  "C" "-0.0316" "-0.0131" NA ...
 $ PC2                   : chr  "C" "0.0161" "-0.0069" NA ...
 $ PC3                   : chr  "C" "-0.01" "0.0383" NA ...
 $ PC4                   : chr  "C" "-0.0131" "-0.005" NA ...
 $ PC5                   : chr  "C" "0.0059" "0.0078" NA ...
 $ PC6                   : chr  "C" "-0.0283" "0.0243" NA ...
 $ PC7                   : chr  "C" "-2e-04" "-0.018" NA ...
 $ PC8                   : chr  "C" "0.0033" "0.0022" NA ...
 $ PC9                   : chr  "C" "-0.0317" "-0.0154" NA ...
 $ PC10                  : chr  "C" "-0.0054" "0.007" NA ...
 $ Sex                   : chr  "D" "F" "M" NA ...
 $ Age                   : chr  "C" NA NA NA ...
 $ ORyear                : chr  "C" NA NA NA ...
 $ Calcification         : chr  "B" NA NA NA ...
 $ Collagen              : chr  "B" NA NA NA ...
 $ Fat10                 : chr  "B" NA NA NA ...
 $ Fat40                 : chr  "B" NA NA NA ...
 $ IPH                   : chr  "B" NA NA NA ...
 $ SMC_rankNorm          : chr  "P" NA NA NA ...
 $ MAC_rankNorm          : chr  "P" NA NA NA ...
 $ Neutrophils_rankNorm  : chr  "P" NA NA NA ...
 $ MastCells_rankNorm    : chr  "P" NA NA NA ...
 $ VesselDensity_rankNorm: chr  "P" NA NA NA ...
 - attr(*, ".internal.selfref")=<externalptr> 

This seems fine, let’s filter; we can use this file to filter the genetic data. And we create another file to re-order the data.


AEGS123_AllChrQC <- subset(AEGS123_AllChr,
               !is.na(QC2018_FILTER),
               select = c("ID_1", "ID_2", "UPID", "STUDY_NUMBER", "SampleID_postImpChrX",
                          "QC2018_FINAL", "QC2018_FILTER", "SELECTION",
                          "AEGS_type", "CHIP", "STUDY_TYPE", "SAMPLE_TYPE",
                          "PC1", "PC2", "PC3", "PC4", "PC5",
                          "PC6", "PC7", "PC8", "PC9", "PC10",
                          "Sex", "Age", "ORyear", 
                          "Calcification", "Collagen", 
                          "Fat10", "Fat40", "IPH", 
                          "SMC_rankNorm", "MAC_rankNorm", "Neutrophils_rankNorm", "MastCells_rankNorm", "VesselDensity_rankNorm"))

AEGS123_AllChrQC_reorder <-AEGS123_AllChrQC[order(AEGS123_AllChrQC$ID_2),] # remember: ID_2 is the order of samples

AEGS123_AllChrQC_filtered <- subset(AEGS123_AllChr,
               is.na(QC2018_FILTER),
               select = c("ID_1", "ID_2", "UPID", "STUDY_NUMBER", "SampleID_postImpChrX",
                          "QC2018_FINAL", "QC2018_FILTER", "SELECTION",
                          "AEGS_type", "CHIP", "STUDY_TYPE", "SAMPLE_TYPE",
                          "PC1", "PC2", "PC3", "PC4", "PC5",
                          "PC6", "PC7", "PC8", "PC9", "PC10",
                          "Sex", "Age", "ORyear", 
                          "Calcification", "Collagen", 
                          "Fat10", "Fat40", "IPH", 
                          "SMC_rankNorm", "MAC_rankNorm", "Neutrophils_rankNorm", "MastCells_rankNorm", "VesselDensity_rankNorm"))

fwrite(AEGS123_AllChrQC_reorder,
       file = paste0(SNP_loc, "/",Today,".",PROJECTNAME,".AEGS123.chrX.sample"),
       na = "NA", sep = "\t", quote = FALSE,
       row.names = FALSE, col.names = TRUE,
       showProgress = TRUE, verbose = TRUE)
This installation of data.table has not been compiled with OpenMP support.
  omp_get_num_procs()            1
  R_DATATABLE_NUM_PROCS_PERCENT  unset (default 50)
  R_DATATABLE_NUM_THREADS        unset
  R_DATATABLE_THROTTLE           unset (default 1024)
  omp_get_thread_limit()         1
  omp_get_max_threads()          1
  OMP_THREAD_LIMIT               unset
  OMP_NUM_THREADS                unset
  RestoreAfterFork               true
  data.table is using 1 threads with throttle==1024. See ?setDTthreads.
No list columns are present. Setting sep2='' otherwise quote='auto' would quote fields containing sep2.
Column writers: 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 
args.doRowNames=0 args.rowNames=0 doQuote=0 args.nrow=2013 args.ncol=35 eolLen=1
maxLineLen=912. Found in 0.000s
Writing bom (false), yaml (0 characters) and column names (true) ... done in 0.001s
Writing 2013 rows in 1 batches of 2013 rows (each buffer size 8MB, showProgress=1, nth=1)
require(DT)
DT::datatable(AEGS123_AllChrQC, caption = "AEGS: final sample list of genotyped AE patients after quality control (chromosome X).", rownames = FALSE)
It seems your data is too big for client-side DataTables. You may consider server-side processing: https://rstudio.github.io/DT/server.htmlIt seems your data is too big for client-side DataTables. You may consider server-side processing: https://rstudio.github.io/DT/server.html

GWASToolKit preparation

VariantLists

Here we create a variantlist.txt file used by GWASToolKit for analysis.

variant_list

temp <- subset(variant_list, select = c("variantid", "chr", "pos"))

fwrite(temp,
       file = paste0(SNP_loc, "/variantlist.txt"),
       na = "NA", sep = "\t", quote = FALSE,
       row.names = FALSE, col.names = FALSE,
       showProgress = TRUE, verbose = TRUE)
This installation of data.table has not been compiled with OpenMP support.
  omp_get_num_procs()            1
  R_DATATABLE_NUM_PROCS_PERCENT  unset (default 50)
  R_DATATABLE_NUM_THREADS        unset
  R_DATATABLE_THROTTLE           unset (default 1024)
  omp_get_thread_limit()         1
  omp_get_max_threads()          1
  OMP_THREAD_LIMIT               unset
  OMP_NUM_THREADS                unset
  RestoreAfterFork               true
  data.table is using 1 threads with throttle==1024. See ?setDTthreads.
No list columns are present. Setting sep2='' otherwise quote='auto' would quote fields containing sep2.
Column writers: 12 5 5 
args.doRowNames=0 args.rowNames=0 doQuote=0 args.nrow=898 args.ncol=3 eolLen=1
maxLineLen=144. Found in 0.000s
Writing bom (false), yaml (0 characters) and column names (false) ... done in 0.001s
Writing 898 rows in 1 batches of 898 rows (each buffer size 8MB, showProgress=1, nth=1)
rm(temp)

Covariates

Here we create a covariates.txt file used by GWASToolKit for analysis.

library(tidyverse)
# for 'overall' analyses
c("Age Sex PC1 PC2 CHIP ORyear") %>% write_lines(paste0(SNP_loc, "/covariates.txt"))

# for sex-specific analyses
c("Age PC1 PC2 CHIP ORyear") %>% write_lines(paste0(SNP_loc, "/covariates.sex.txt"))

Phenotypes

Here we create a phenotypes.txt file used by GWASToolKit for analysis.

library(tidyverse)
c("Calcification", "Collagen", "Fat10", "Fat40", "IPH", "SMC_rankNorm", "MAC_rankNorm", "Neutrophils_rankNorm", "MastCells_rankNorm", "VesselDensity_rankNorm") %>% write_lines(paste0(SNP_loc, "/phenotypes.txt"))

Session information


Version:      v1.0.2
Last update:  2020-09-12
Written by:   Sander W. van der Laan (s.w.vanderlaan-2[at]umcutrecht.nl).
Description:  Script to get some Athero-Express Biobank Study baseline characteristics.
Minimum requirements: R version 3.4.3 (2017-06-30) -- 'Single Candle', Mac OS X El Capitan

Changes log
* v1.0.2 Updated baseline characteristics information. Update GWASToolKit preparation. Added more candidate SNPs to look at. Updated some variable names. 
* v1.0.1 Add an additional phenotype.
* v1.0.0 Initial version. Fixed baseline table, added codes, and results. Created sample-files.

sessionInfo()
© 1979-2020 Sander W. van der Laan | s.w.vanderlaan[at]gmail.com | swvanderlaan.github.io.
LS0tCnRpdGxlOiAiQXNzb2NpYXRpb24gb2YgQ0FDIHN1c2NlcHRpYmlsaXR5IGxvY2kgcGxhcXVlIGNoYXJhY3RlcmlzdGljcy4iCmF1dGhvcjogIltTYW5kZXIgVy4gdmFuIGRlciBMYWFuLCBQaERdKGh0dHBzOi8vc3d2YW5kZXJsYWFuLmdpdGh1Yi5pbykgfCBAc3d2YW5kZXJsYWFuIHwgcy53LnZhbmRlcmxhYW5AZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY2FjaGU6IHllcwogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2xsYXBzZTogeWVzCiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZy5hbGlnbjogY2VudGVyCiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBmaWdfaGVpZ2h0OiA2CiAgICBmaWdfcmV0aW5hOiAyCiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHRoZW1lOiBsdW1lbgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBubwogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMKbWFpbmZvbnQ6IEFyaWFsCnN1YnRpdGxlOiAiQSAnZHJ1Z2dhYmxlLU1JLXRhcmdldHMnIHByb2plY3QiCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZBTFNFfQojIGZ1cnRoZXIgZGVmaW5lIHNvbWUga25pdHItb3B0aW9ucy4Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOCwgZmlnLnBhdGggPSAnRmlndXJlcy8nLCAKICAgICAgICAgICAgICAgICAgICAgIHd3YXJuaW5nID0gVFJVRSwgIyBzaG93IHdhcm5pbmdzIGR1cmluZyBjb2RlYm9vayBnZW5lcmF0aW9uCiAgbWVzc2FnZSA9IFRSVUUsICMgc2hvdyBtZXNzYWdlcyBkdXJpbmcgY29kZWJvb2sgZ2VuZXJhdGlvbgogIGVycm9yID0gVFJVRSwgIyBkbyBub3QgaW50ZXJydXB0IGNvZGVib29rIGdlbmVyYXRpb24gaW4gY2FzZSBvZiBlcnJvcnMsCiAgICAgICAgICAgICAgICAjIHVzdWFsbHkgYmV0dGVyIGZvciBkZWJ1Z2dpbmcKICBlY2hvID0gVFJVRSwgICMgc2hvdyBSIGNvZGUKICAgICAgICAgICAgICAgICAgICAgIGV2YWwgPSBUUlVFKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfbWluaW1hbCgpKQpwYW5kZXI6OnBhbmRlck9wdGlvbnMoInRhYmxlLnNwbGl0LnRhYmxlIiwgSW5mKQpgYGAKCiMgU2V0dXAKV2Ugd2lsbCBjbGVhbiB0aGUgZW52aXJvbm1lbnQsIHNldHVwIHRoZSBsb2NhdGlvbnMsIGRlZmluZSBjb2xvcnMsIGFuZCBjcmVhdGUgYSBkYXRlc3RhbXAuCgpfQ2xlYW4gdGhlIGVudmlyb25tZW50Ll8KYGBge3IgZWNobyA9IEZBTFNFfQpybShsaXN0ID0gbHMoKSkKYGBgCgpfU2V0IGxvY2F0aW9ucyBhbmQgd29ya2luZyBkaXJlY3Rvcmllcy4uLl8KYGBge3IgTG9jYWxTeXN0ZW0sIGVjaG8gPSBGQUxTRX0KIyMjIE9wZXJhdGluZyBTeXN0ZW0gVmVyc2lvbgojIyMgTWFjIFBybwojIFJPT1RfbG9jID0gIi9Wb2x1bWVzL0VsaXRlUHJvUXgyTWVkaWEiCiMgR0VOT01JQ19sb2MgPSAiL1VzZXJzL3N2YW5kZXJsYWFuL2lDbG91ZC9HZW5vbWljcyIKIyBBRURCX2xvYyA9IHBhc3RlMChHRU5PTUlDX2xvYywgIi9BRS1BQUFfR1NfREJzIikKIyBMQUJfbG9jID0gcGFzdGUwKEdFTk9NSUNfbG9jLCAiL0xhYkJ1c2luZXNzIikKIyBQTElOS19sb2M9cGFzdGUwKFJPT1RfbG9jLCIvUExJTksiKQojIEFFR1NRQ19sb2MgPSAgcGFzdGUwKFBMSU5LX2xvYywgIi9fQUVfT1JJR0lOQUxTL0FFR1NfQ09NQklORURfUUMyMDE4IikKIyBQUk9KRUNUX2xvYyA9IHBhc3RlMChST09UX2xvYywgIi9QTElOSy9hbmFseXNlcy9iYXNlbGluZSIpCgojIyMgTWFjQm9vawpST09UX2xvYyA9ICIvVXNlcnMvc3d2YW5kZXJsYWFuIgpHRU5PTUlDX2xvYyA9IHBhc3RlMChST09UX2xvYywgIi9pQ2xvdWQvR2Vub21pY3MiKQpBRURCX2xvYyA9IHBhc3RlMChHRU5PTUlDX2xvYywgIi9BRS1BQUFfR1NfREJzIikKTEFCX2xvYyA9IHBhc3RlMChHRU5PTUlDX2xvYywgIi9MYWJCdXNpbmVzcyIpClBMSU5LX2xvYz1wYXN0ZTAoUk9PVF9sb2MsIi9QTElOSyIpCkFFR1NRQ19sb2MgPSAgcGFzdGUwKFBMSU5LX2xvYywgIi9fQUVfT1JJR0lOQUxTL0FFR1NfQ09NQklORURfUUMyMDE4IikKUFJPSkVDVF9sb2MgPSBwYXN0ZTAoUk9PVF9sb2MsICIvUExJTksvYW5hbHlzZXMvbG9va3Vwcy9BRV8yMDIwMDUxMl9DT0xfTUtBVk9VU0lfTUJPU19DSEFSR0VfMTAwMEdfQ0FDIikKTUlDSElNUF9sb2M9cGFzdGUwKFBMSU5LX2xvYywiL19BRV9PUklHSU5BTFMvQUVHU19DT01CSU5FRF9FQUdMRTJfMTAwMEdwM3Y1SFJDcjExIikKCiMgdXNlIHRoaXMgaWYgdGhlcmUgaXMgcmVsZXZhbnQgaW5mb3JtYXRpb24gaGVyZS4KVEFSR0VUX2xvYyA9IHBhc3RlMChHRU5PTUlDX2xvYywgIi9BdGhlcm8tRXhwcmVzcy9Gb3Jtcy8yMDIwL0FFXzIwMjAwNTEyX0NPTF9NS0FWT1VTSV9NQk9TX0NIQVJHRV8xMDAwR19DQUMiKQoKIyMjIFNPTUUgVkFSSUFCTEVTIFdFIE5FRUQgRE9XTiBUSEUgTElORQpUUkFJVF9PRl9JTlRFUkVTVCA9ICJDQUMiICMgUGhlbm90eXBlClBST0pFQ1ROQU1FID0gIkNBQyIKCmNhdCgiXG5DcmVhdGUgYSBuZXcgYW5hbHlzaXMgZGlyZWN0b3J5Li4uXG4iKQppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKFBST0pFQ1RfbG9jLCAiLyIsUFJPSkVDVE5BTUUpKSwgCiAgICAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChQUk9KRUNUX2xvYywgIi8iLFBST0pFQ1ROQU1FKSksIAogICAgICAgRkFMU0UpCkFOQUxZU0lTX2xvYyA9IHBhc3RlMChQUk9KRUNUX2xvYywiLyIsUFJPSkVDVE5BTUUpCgppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKEFOQUxZU0lTX2xvYywgIi9QTE9UUyIpKSwgCiAgICAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChBTkFMWVNJU19sb2MsICIvUExPVFMiKSksIAogICAgICAgRkFMU0UpClBMT1RfbG9jID0gcGFzdGUwKEFOQUxZU0lTX2xvYywiL1BMT1RTIikKCmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoUExPVF9sb2MsICIvUUMiKSksIAogICAgICAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoUExPVF9sb2MsICIvUUMiKSksIAogICAgICAgRkFMU0UpClFDX2xvYyA9IHBhc3RlMChQTE9UX2xvYywiL1FDIikKCmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoQU5BTFlTSVNfbG9jLCAiL09VVFBVVCIpKSwgCiAgICAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChBTkFMWVNJU19sb2MsICIvT1VUUFVUIikpLCAKICAgICAgIEZBTFNFKQpPVVRfbG9jID0gcGFzdGUwKEFOQUxZU0lTX2xvYywgIi9PVVRQVVQiKQoKaWZlbHNlKCFkaXIuZXhpc3RzKGZpbGUucGF0aChBTkFMWVNJU19sb2MsICIvQkFTRUxJTkUiKSksIAogICAgICAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoQU5BTFlTSVNfbG9jLCAiL0JBU0VMSU5FIikpLCAKICAgICAgIEZBTFNFKQpCQVNFTElORV9sb2MgPSBwYXN0ZTAoQU5BTFlTSVNfbG9jLCAiL0JBU0VMSU5FIikKCmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoUFJPSkVDVF9sb2MsICIvU05QIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKFBST0pFQ1RfbG9jLCAiL1NOUCIpKSwgCiAgICAgICBGQUxTRSkKU05QX2xvYyA9IHBhc3RlMChQUk9KRUNUX2xvYywgIi9TTlAiKQoKc2V0d2QocGFzdGUwKFBST0pFQ1RfbG9jKSkKZ2V0d2QoKQpsaXN0LmZpbGVzKCkKCmBgYAoKXy4uLiBhIHBhY2thZ2UtaW5zdGFsbGF0aW9uIGZ1bmN0aW9uIC4uLl8KYGBge3IgRnVuY3Rpb246IGluc3RhbGxhdGlvbnN9Cmluc3RhbGwucGFja2FnZXMuYXV0byA8LSBmdW5jdGlvbih4KSB7IAogIHggPC0gYXMuY2hhcmFjdGVyKHN1YnN0aXR1dGUoeCkpIAogIGlmIChpc1RSVUUoeCAlaW4lIC5wYWNrYWdlcyhhbGwuYXZhaWxhYmxlID0gVFJVRSkpKSB7IAogICAgZXZhbChwYXJzZSh0ZXh0ID0gc3ByaW50ZigicmVxdWlyZShcIiVzXCIpIiwgeCkpKQogIH0gZWxzZSB7IAogICAgIyBVcGRhdGUgaW5zdGFsbGVkIHBhY2thZ2VzIC0gdGhpcyBtYXkgbWVhbiBhIGZ1bGwgdXBncmFkZSBvZiBSLCB3aGljaCBpbiB0dXJuCiAgICAjIG1heSBub3QgYmUgd2FycmVudGVkLiAKICAgICN1cGRhdGUucGFja2FnZXMoYXNrID0gRkFMU0UpIAogICAgZXZhbChwYXJzZSh0ZXh0ID0gc3ByaW50ZigiaW5zdGFsbC5wYWNrYWdlcyhcIiVzXCIsIGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gXCJodHRwOi8vY3Jhbi1taXJyb3IuY3MudXUubmwvXCIpIiwgeCkpKQogIH0KICBpZiAoaXNUUlVFKHggJWluJSAucGFja2FnZXMoYWxsLmF2YWlsYWJsZSA9IFRSVUUpKSkgeyAKICAgIGV2YWwocGFyc2UodGV4dCA9IHNwcmludGYoInJlcXVpcmUoXCIlc1wiKSIsIHgpKSkKICB9IGVsc2UgewogICAgc291cmNlKCJodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9iaW9jTGl0ZS5SIikKICAgICMgVXBkYXRlIGluc3RhbGxlZCBwYWNrYWdlcyAtIHRoaXMgbWF5IG1lYW4gYSBmdWxsIHVwZ3JhZGUgb2YgUiwgd2hpY2ggaW4gdHVybgogICAgIyBtYXkgbm90IGJlIHdhcnJlbnRlZC4KICAgICNiaW9jTGl0ZShjaGFyYWN0ZXIoKSwgYXNrID0gRkFMU0UpIAogICAgZXZhbChwYXJzZSh0ZXh0ID0gc3ByaW50ZigiYmlvY0xpdGUoXCIlc1wiKSIsIHgpKSkKICAgIGV2YWwocGFyc2UodGV4dCA9IHNwcmludGYoInJlcXVpcmUoXCIlc1wiKSIsIHgpKSkKICB9Cn0KYGBgCgpfLi4uIGFuZCBsb2FkIHRob3NlIHBhY2thZ2VzLl8KYGBge3IgbG9hZGluZ19wYWNrYWdlc30KaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJyZWFkciIpCmluc3RhbGwucGFja2FnZXMuYXV0bygib3B0cGFyc2UiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oInRvb2xzIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJkcGx5ciIpCmluc3RhbGwucGFja2FnZXMuYXV0bygidGlkeXIiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIm5hbmlhciIpCgojIFRvIGdldCAnZGF0YS50YWJsZScgd2l0aCAnZndyaXRlJyB0byBiZSBhYmxlIHRvIGRpcmVjdGx5IHdyaXRlIGd6aXBwZWQtZmlsZXMKIyBSZWY6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQyNzg4NDAxL2lzLXBvc3NpYmxlLXRvLXVzZS1md3JpdGUtZnJvbS1kYXRhLXRhYmxlLXdpdGgtZ3pmaWxlCiMgaW5zdGFsbC5wYWNrYWdlcygiZGF0YS50YWJsZSIsIHJlcG9zID0gImh0dHBzOi8vUmRhdGF0YWJsZS5naXRsYWIuaW8vZGF0YS50YWJsZSIpCmxpYnJhcnkoZGF0YS50YWJsZSkKCmluc3RhbGwucGFja2FnZXMuYXV0bygidGlkeXZlcnNlIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJrbml0ciIpCmluc3RhbGwucGFja2FnZXMuYXV0bygiRFQiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oImVlcHRvb2xzIikKCmluc3RhbGwucGFja2FnZXMuYXV0bygiaGF2ZW4iKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oInRhYmxlb25lIikKCmluc3RhbGwucGFja2FnZXMuYXV0bygiQmxhbmRBbHRtYW5MZWgiKQoKIyBJbnN0YWxsIHRoZSBkZXZ0b29scyBwYWNrYWdlIGZyb20gSGFkbGV5IFdpY2toYW0KaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCdkZXZ0b29scycpCgojIGZvciBwbG90dGluZwppbnN0YWxsLnBhY2thZ2VzLmF1dG8oInBoZWF0bWFwIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJmb3Jlc3RwbG90IikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJnZ3Bsb3QyIikKCmluc3RhbGwucGFja2FnZXMuYXV0bygiZ2dwdWJyIikKCmluc3RhbGwucGFja2FnZXMuYXV0bygiVXBTZXRSIikKCmRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigidGhvbWFzcDg1L3BhdGNod29yayIpCgpgYGAKCl9XZSB3aWxsIGNyZWF0ZSBhIGRhdGVzdGFtcCBhbmQgZGVmaW5lIHRoZSBVdHJlY2h0IFNjaWVuY2UgUGFyayBDb2xvdXIgU2NoZW1lXy4KYGBge3IgU2V0dGluZzogQ29sb3JzfQoKVG9kYXkgPSBmb3JtYXQoYXMuRGF0ZShhcy5QT1NJWGx0KFN5cy50aW1lKCkpKSwgIiVZJW0lZCIpClRvZGF5LlJlcG9ydCA9IGZvcm1hdChhcy5EYXRlKGFzLlBPU0lYbHQoU3lzLnRpbWUoKSkpLCAiJUEsICVCICVkLCAlWSIpCgojIyMgVXRyZWNodFNjaWVuY2VQYXJrQ29sb3Vyc1NjaGVtZQojIyMKIyMjIFdlYnNpdGV0b2NvbnZlcnRIRVh0b1JHQjpodHRwOi8vaGV4LmNvbG9ycnJzLmNvbS4KIyMjIEZvcnNvbWVmdW5jdGlvbnN5b3VzaG91bGRkaXZpZGV0aGVzZW51bWJlcnNieTI1NS4KIyMjCiMjIwlOby4JQ29sb3IJCQkgICAgICBIRVgJKFJHQikJCQkJCQkgICAgICAgICAgICAgIENIUgkJICBNQUYvSU5GTwojIyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyMjCTEJICB5ZWxsb3cJCQkgICAgI0ZCQjgyMCAoMjUxLDE4NCwzMikJCQkJICAgICAgPT4JMQkJb3IgMS4wPklORk8KIyMjCTIJICBnb2xkCQkJICAgICAgI0Y1OUQxMCAoMjQ1LDE1NywxNikJCQkJICAgICAgPT4JMgkJCiMjIwkzCSAgc2FsbW9uCQkJICAgICNFNTU3MzggKDIyOSw4Nyw1NikJCQkJICAgICAgPT4JMwkJb3IgMC4wNTxNQUY8MC4yIG9yIDAuNDxJTkZPPDAuNgojIyMJNAkgIGRhcmtwaW5rCQkgICAgI0RCMDAzRiAoKDIxOSwwLDYzKQkJCQkgICAgICA9Pgk0CQkKIyMjCTUJICBsaWdodHBpbmsJCSAgICAjRTM1NDkzICgyMjcsODQsMTQ3KQkJCQkgICAgICA9Pgk1CQlvciAwLjg8SU5GTzwxLjAKIyMjCTYJICBwaW5rCQkJICAgICAgI0Q1MjY3QiAoMjEzLDM4LDEyMykJCQkJICAgICAgPT4JNgkJCiMjIwk3CSAgaGFyZHBpbmsJCSAgICAjQ0MwMDcxICgyMDQsMCwxMTMpCQkJCSAgICAgID0+CTcJCQojIyMJOAkgIGxpZ2h0cHVycGxlCSAgICAjQTg0NDhBICgxNjgsNjgsMTM4KQkJCQkgICAgICA9Pgk4CQkKIyMjCTkJICBwdXJwbGUJCQkgICAgIzlBMzQ4MCAoMTU0LDUyLDEyOCkJCQkJICAgICAgPT4JOQkJCiMjIwkxMAlsYXZlbmRlbAkJICAgICM4RDVCOUEgKDE0MSw5MSwxNTQpCQkJCSAgICAgID0+CTEwCQkKIyMjCTExCWJsdWVwdXJwbGUJCSAgIzcwNTI5NiAoMTEyLDgyLDE1MCkJCQkJICAgICAgPT4JMTEJCQojIyMJMTIJcHVycGxlYmx1ZQkJICAjNjg2QUE5ICgxMDQsMTA2LDE2OSkJCQkgICAgICA9PgkxMgkJCiMjIwkxMwlsaWdodHB1cnBsZWJsdWUJIzYxNzNBRCAoOTcsMTE1LDE3My8xMDEsMTIwLDE4MCkJPT4JMTMJCQojIyMJMTQJc2VhYmx1ZQkJCSAgICAjNEM4MUJGICg3NiwxMjksMTkxKQkJCQkgICAgICA9PgkxNAkJCiMjIwkxNQlza3libHVlCQkJICAgICMyRjhCQzkgKDQ3LDEzOSwyMDEpCQkJCSAgICAgID0+CTE1CQkKIyMjCTE2CWF6dXJibHVlCQkgICAgIzEyOTBEOSAoMTgsMTQ0LDIxNykJCQkJICAgICAgPT4JMTYJCW9yIDAuMDE8TUFGPDAuMDUgb3IgMC4yPElORk88MC40CiMjIwkxNwlsaWdodGF6dXJibHVlCSAgIzEzOTZEOCAoMTksMTUwLDIxNikJCQkJICAgICAgPT4JMTcJCQojIyMJMTgJZ3JlZW5ibHVlCQkgICAgIzE1QTZDMSAoMjEsMTY2LDE5MykJCQkJICAgICAgPT4JMTgJCQojIyMJMTkJc2Vhd2VlZGdyZWVuCSAgIzVFQjE3RiAoOTQsMTc3LDEyNykJCQkJICAgICAgPT4JMTkJCQojIyMJMjAJeWVsbG93Z3JlZW4JCSAgIzg2QjgzMyAoMTM0LDE4NCw1MSkJCQkJICAgICAgPT4JMjAJCQojIyMJMjEJbGlnaHRtb3NzZ3JlZW4JI0M1RDIyMCAoMTk3LDIxMCwzMikJCQkJICAgICAgPT4JMjEJCQojIyMJMjIJbW9zc2dyZWVuCQkgICAgIzlGQzIyOCAoMTU5LDE5NCw0MCkJCQkJICAgICAgPT4JMjIJCW9yIE1BRj4wLjIwIG9yIDAuNjxJTkZPPDAuOAojIyMJMjMJbGlnaHRncmVlbgkgIAkjNzhCMTEzICgxMjAsMTc3LDE5KQkJCQkgICAgICA9PgkyMy9YCiMjIwkyNAlncmVlbgkJCSAgICAgICM0OUEwMUQgKDczLDE2MCwyOSkJCQkJICAgICAgPT4JMjQvWQojIyMJMjUJZ3JleQkJCSAgICAgICM1OTVBNUMgKDg5LDkwLDkyKQkJCQkgICAgICAgID0+CTI1L1hZCW9yIE1BRjwwLjAxIG9yIDAuMDxJTkZPPDAuMgojIyMJMjYJbGlnaHRncmV5CQkgICAgI0EyQTNBNAkoMTYyLDE2MywxNjQpCQkJICAgICAgPT4JMjYvTVQKIyMjCiMjIwlBRERJVElPTkFMIENPTE9SUwojIyMJMjcJbWlkZ3JleQkJCSNEN0Q4RDcKIyMjCTI4CXZlcnlsaWdodGdyZXkJI0VDRUNFQyIKIyMjCTI5CXdoaXRlCQkJI0ZGRkZGRgojIyMJMzAJYmxhY2sJCQkjMDAwMDAwCiMjIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnVpdGhvZl9jb2xvciA9IGMoIiNGQkI4MjAiLCIjRjU5RDEwIiwiI0U1NTczOCIsIiNEQjAwM0YiLCIjRTM1NDkzIiwiI0Q1MjY3QiIsCiAgICAgICAgICAgICAgICAgIiNDQzAwNzEiLCIjQTg0NDhBIiwiIzlBMzQ4MCIsIiM4RDVCOUEiLCIjNzA1Mjk2IiwiIzY4NkFBOSIsCiAgICAgICAgICAgICAgICAgIiM2MTczQUQiLCIjNEM4MUJGIiwiIzJGOEJDOSIsIiMxMjkwRDkiLCIjMTM5NkQ4IiwiIzE1QTZDMSIsCiAgICAgICAgICAgICAgICAgIiM1RUIxN0YiLCIjODZCODMzIiwiI0M1RDIyMCIsIiM5RkMyMjgiLCIjNzhCMTEzIiwiIzQ5QTAxRCIsCiAgICAgICAgICAgICAgICAgIiM1OTVBNUMiLCIjQTJBM0E0IiwgIiNEN0Q4RDciLCAiI0VDRUNFQyIsICIjRkZGRkZGIiwgIiMwMDAwMDAiKQoKdWl0aG9mX2NvbG9yX2xlZ2VuZCA9IGMoIiNGQkI4MjAiLCAiI0Y1OUQxMCIsICIjRTU1NzM4IiwgIiNEQjAwM0YiLCAiI0UzNTQ5MyIsCiAgICAgICAgICAgICAgICAgICAgICAgICIjRDUyNjdCIiwgIiNDQzAwNzEiLCAiI0E4NDQ4QSIsICIjOUEzNDgwIiwgIiM4RDVCOUEiLAogICAgICAgICAgICAgICAgICAgICAgICAiIzcwNTI5NiIsICIjNjg2QUE5IiwgIiM2MTczQUQiLCAiIzRDODFCRiIsICIjMkY4QkM5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIiMxMjkwRDkiLCAiIzEzOTZEOCIsICIjMTVBNkMxIiwgIiM1RUIxN0YiLCAiIzg2QjgzMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICIjQzVEMjIwIiwgIiM5RkMyMjgiLCAiIzc4QjExMyIsICIjNDlBMDFEIiwgIiM1OTVBNUMiLAogICAgICAgICAgICAgICAgICAgICAgICAiI0EyQTNBNCIsICIjRDdEOEQ3IiwgIiNFQ0VDRUMiLCAiI0ZGRkZGRiIsICIjMDAwMDAwIikKIyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBgCgojIEludHJvZHVjdGlvbgoKIyMgUHJvamVjdCBkZXRhaWxzCgoqQ29sbGFib3JhdG9ycyoKCk1hcnlhbSBLYXZvdXNpClBhdHJpY2lhIFBleXNlcgpNYXhpbWUgQm9zCgoqUHJvamVjdCBJRCogCkFFXzIwMjAwNTEyX0NPTF9NS0FWT1VTSV9NQk9TX0NIQVJHRV8xMDAwR19DQUMKCgojIyBCYWNrZ3JvdW5kCgpIZXJlIHdlIG1hcCB0aGUgQ0hBUkdFIENvbnNvcnRpdW0gMTAwMEcgR1dBUyBvbiBfY29yb25hcnkgYXJ0ZXJ5IGNhbGNpZmljYXRpb24gKENBQylfIHN1c2NlcHRpYmlsaXR5IGxvY2kgdG8gdGhlIHNpbmdsZS1jZWxsIGNhcm90aWQgcGxhcXVlIGRhdGEuIFRoZXNlIGFyZSBnaXZlbiBpbjoKCi0gSW5kU2lnU05Qc2ZvclNhbmRlci54bHN4Ci0gR2VuZUxpc3RfMTUwNDIwMjAueGxzeAoKYGBge3IgQ0FDIHRhcmdldHN9CmxpYnJhcnkob3Blbnhsc3gpCgpnZW5lX2xpc3QgPC0gcmVhZC54bHN4KHBhc3RlMChUQVJHRVRfbG9jLCAiL0dlbmVMaXN0XzE1MDQyMDIwLnhsc3giKSkKCnZhcmlhbnRfbGlzdCA8LSByZWFkLnhsc3gocGFzdGUwKFRBUkdFVF9sb2MsICIvQ2FuZGlkYXRlU05Qc2ZvclNhbmRlci54bHN4IikpCgoKRFQ6OmRhdGF0YWJsZShnZW5lX2xpc3QpCgpEVDo6ZGF0YXRhYmxlKHZhcmlhbnRfbGlzdCkKCmBgYAoKV2Ugd2lsbCBjb25zdHJ1Y3QgYSBsaXN0IG9mIGdlbmVzIHRvIG1hcCB0byBvdXIgc2NSTkFzZXEgZGF0YS4gCgpgYGB7ciBDQUMgdGFyZ2V0cyBmb3IgbWFwcGluZ30KCnRhcmdldF9nZW5lcyA8LSB1bmxpc3QoZ2VuZV9saXN0JHN5bWJvbCkKdGFyZ2V0X2dlbmVzCmBgYAoKCgpXZSB3aWxsIHRlc3QgdGhlIGh5cG90aGVzaXMgdGhhdCBDQUMgc3VzY2VwdGliaWxpdHkgbG9jaSBhcmUgYXNzb2NpYXRlZCB3aXRoIHBsYXF1ZSBjaGFyYWN0ZXJpc3RpY3MuIFdlIHdpbGwgdXNlIGRhdGEgZnJvbSB0aGUgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBTdHVkeS4KCiMjIFN0dWR5IGRlc2lnbgoKV2Ugd2lsbCBwZXJmb3JtIHJlZ3Jlc3Npb24gYW5hbHlzZXMgYWRqdXN0ZWQgZm9yIGFnZSwgc2V4ICh3aGVyZSBhcHBsaWNhYmxlKSBhbmQgcHJpbmNpcGFsIGNvbXBvbmVudHMuCgojIyBNb2RlbGluZwoKV2Ugd2lsbCBhcHBseSB0aGUgZm9sbG93aW5nIG1vZGVsczoKCm1vZGVsIDE6IGBwaGVub3R5cGUgfiBhZ2UgKyBzZXggKyBjaGlwLXVzZWQgKyBQQzEgKyBQQzIgKyB5ZWFyLW9mLXN1cmdlcnlgCgpwaGVub3R5cGVzIGFyZToKCi0gYGNhbGNpZmljYXRpb25gLCBjb2RlZCBgQ2FsYy5iaW5gIG5vL21pbm9yIHZzLiBtb2RlcmF0ZS9oZWF2eSBzdGFpbmluZwotIGBjb2xsYWdlbmAsIGNvZGVkIGBDb2xsYWdlbi5iaW5gIG5vL21pbm9yIHZzLiBtb2RlcmF0ZS9oZWF2eSBzdGFpbmluZwotIGBmYXQxMGAsIGNvZGVkIGBGYXQuYmluXzEwYCBuby88MTAlIGZhdCB2cy4gPjEwJSBmYXQKLSBgZmF0NDBgLCBjb2RlZCBgRmF0LmJpbl80MGAgbm8vPDQwJSBmYXQgdnMuID40MCUgZmF0Ci0gYGludHJhcGxhcXVlIGhlbW9ycmhhZ2VgLCBjb2RlZCBgSVBILmJpbmAgbm8gdnMuIHllcwotIGBtYWNyb3BoYWdlcyAoQ0Q2OClgLCBjb2RlZCBgbWFjbWVhbjBgIG1lYW4gb2YgY29tcHV0ZXItYXNzaXN0ZWQgY2FsY3VsYXRpb24gQ0Q2ODxzdXA+Kzwvc3VwPiByZWdpb24gb2YgaW50ZXJlc3QKLSBgc21vb3RoIG11c2NsZSBjZWxscyAoYWxwaGEtYWN0aW4pYCwgY29kZWQgYHNtY21lYW4wYCBtZWFuIG9mIGNvbXB1dGVyLWFzc2lzdGVkIGNhbGN1bGF0aW9uIFNNQTxzdXA+Kzwvc3VwPiByZWdpb24gb2YgaW50ZXJlc3QKLSBgaW50cmFwbGFxdWUgdmVzc2VsIGRlbnNpdHkgKENEMzQpYCwgY29kZWQgYHZlc3NlbF9kZW5zaXR5YCBtYW51YWxseSBjb3VudGVkIENEMzQ8c3VwPis8L3N1cD4gY2VsbHMgcGVyIDMtNCBob3RzcG90cwotIGBtYXN0IGNlbGxzYCwgY29kZWQgYE1hc3RfY2VsbHNfcGxhcXVlYCBtYW51YWxseSBjb3VudGVkIG1hc3QgY2VsbCB0cnlwdGFzZTxzdXA+Kzwvc3VwPiBjZWxscyAoaHR0cHM6Ly9hY2FkZW1pYy5vdXAuY29tL2V1cmhlYXJ0ai9hcnRpY2xlLzM0LzQ4LzM2OTkvNDg0OTgxKQotIGBuZXV0cm9waGlscyAoQ0Q2NmIpYCwgY29kZWQgYG5ldXRyb3BoaWxzYCBtYW51YWxseSBjb3VudGVkIENENjZiPHN1cD4rPC9zdXA+IGNlbGxzIChodHRwczovL3B1Ym1lZC5uY2JpLm5sbS5uaWguZ292LzIwNTk1NjUwLykKCgojIyBBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIFN0dWR5CgpUaGUgKltBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIFN0dWR5IChBRSldKGh0dHA6Ly93d3cuYXRoZXJvZXhwcmVzcy5ubCl7dGFyZ2V0PSJfYmxhbmsifSogY29udGFpbnMgcGxhcXVlIG1hdGVyaWFsIG9mIHBhdGllbnRzIHRoYXQgdW5kZXJ3ZW50IGVuZGFydGVyZWN0b215YXQgdHdvIER1dGNoIHRlcnRpYXJ5IHJlZmVycmFsIGNlbnRlcnMuIERldGFpbHMgb2YgdGhlIHN0dWR5IGRlc2lnbiB3ZXJlIGRlc2NyaWJlZCBiZWZvcmUuIEJyaWVmbHksIGJsb29kIGFuZCBwbGFxdWUgbWF0ZXJpYWwgd2VyZSBvYnRhaW5lZCBkdXJpbmcgZW5kYXJ0ZXJlY3RvbXkgYW5kIHN0b3JlZCBhdCAtODAg4oSDLiBPbmx5IGNhcm90aWQgZW5kYXJ0ZXJlY3RvbXkgKENFQSkgcGF0aWVudHMgd2VyZSBpbmNsdWRlZCBpbiB0aGUgcHJlc2VudCBzdHVkeS4gQWxsIHBhdGllbnRzIHByb3ZpZGVkIGluZm9ybWVkIGNvbnNlbnQgYW5kIHRoZSBzdHVkeSB3YXMgYXBwcm92ZWQgYnkgdGhlIG1lZGljYWwgZXRoaWNzIGNvbW1pdHRlZS4KCiMjIEF0aGVyby1FeHByZXNzIEdlbm9taWNzIFN0dWR5CgojIyMgRE5BIGlzb2xhdGlvbiBhbmQgZ2Vub3R5cGluZwoKV2UgZ2Vub3R5cGVkIHRoZSBBRSBpbiB0aHJlZSBzZXBhcmF0ZSwgYnV0IGNvbnNlY3V0aXZlIGV4cGVyaW1lbnRzLiBJbiBzaG9ydCwgRE5BIHdhcyBleHRyYWN0ZWQgZnJvbSBFRFRBIGJsb29kIG9yICh3aGVuIG5vIGJsb29kIHdhcyBhdmFpbGFibGUpIHBsYXF1ZSBzYW1wbGVzIG9mIDEsODU4IGNvbnNlY3V0aXZlIHBhdGllbnRzIGZyb20gdGhlIEF0aGVyby1FeHByZXNzIEJpb2JhbmsgU3R1ZHkgYW5kIGdlbm90eXBlZCBpbiAzIGJhdGNoZXMuIAoKRm9yIHRoZSBfQXRoZXJvLUV4cHJlc3MgR2Vub21pY3MgU3R1ZHkgMSAoQUVHUzEpXyA4OTEgcGF0aWVudHMgKDYwMiBtYWxlcywgMjYyIGZlbWFsZXMsIDI3IHVua25vd24gc2V4KSwgaW5jbHVkZWQgYmV0d2VlbiAyMDAyIGFuZCAyMDA3LCB3ZXJlIGdlbm90eXBlZCAoNDQwLDc2MyBtYXJrZXJzKSB1c2luZyB0aGUgQWZmeW1ldHJpeCBHZW5vbWUtV2lkZSBIdW1hbiBTTlAgQXJyYXkgNS4wIChTTlA1KSBjaGlwIChBZmZ5bWV0cml4IEluYy4sIFNhbnRhIENsYXJhLCBDQSwgVVNBKSBhdCBbRXVyb2ZpbnMgR2Vub21pY3NdKGh0dHBzOi8vd3d3LmV1cm9maW5zZ2Vub21pY3MuZXUvKXt0YXJnZXQ9Il9ibGFuayJ9IChmb3JtZXJseSBrbm93biBhcyBBUk9TKS4gCgpGb3IgdGhlIF9BdGhlcm8tRXhwcmVzcyBHZW5vbWljcyBTdHVkeSAyIChBRUdTMilfIDk1NCBwYXRpZW50cyAoNjQwIG1ha2VzLCAzMTMgZmVtYWxlcywgMSB1bmtub3duIHNleCksIGluY2x1ZGVkIGJldHdlZW4gMjAwMiBhbmQgMjAxMywgd2VyZSBnZW5vdHlwZWQgKDU4NywzNTEgbWFya2VycykgdXNpbmcgdGhlIEFmZnltZXRyaXggQXhpb23ik4cgR1cgQ0VVIDEgQXJyYXkgKEF4TSkgYXQgdGhlIFtHZW5vbWUgQW5hbHlzaXMgQ2VudGVyXShodHRwczovL3d3dy5oZWxtaG9sdHotbXVlbmNoZW4uZGUvbm9fY2FjaGUvZ2FjL2luZGV4Lmh0bWwpe3RhcmdldD0iX2JsYW5rIn0uCgpGb3IgdGhlIF9BdGhlcm8tRXhwcmVzcyBHZW5vbWljcyBTdHVkeSAzIChBRUdTMylfIDY1OCBwYXRpZW50cyAoNDQ4IG1hbGVzLCAyMDMgZmVtYWxlcywgNSB1bmtub3duIHNleCksIGluY2x1ZGVkIGJldHdlZW4gMjAwMiBhbmQgMjAxNiwgd2VyZSBnZW5vdHlwZWQgKDY5Myw5MzEgbWFya2VycykgdXNpbmcgdGhlIElsbHVtaW5hIEdTQSBNRCB2MSBCZWFkQXJyYXkgKEdTQSkgYXQgW0h1bWFuIEdlbm9taWNzIEZhY2lsaXR5LCBIVUdFLUZdKGh0dHA6Ly9nbGltZG5hLm9yZy9pbmRleC5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9LiAKCkFsbCBleHBlcmltZW50cyB3ZXJlIGNhcnJpZWQgb3V0IGFjY29yZGluZyB0byBPRUNEIHN0YW5kYXJkcy4gCgojIyMgR2Vub3R5cGluZyBjYWxsaW5nCgpXZSB1c2VkIHRoZSBnZW5vdHlwaW5nIGNhbGxpbmcgYWxnb3JpdGhtcyBhcyBhZHZpc2VkIGJ5IEFmZnltZXRyaXggKEFFR1MxIGFuZCBBRUdTMikgYW5kIElsbHVtaW5hIChBRUdTMyk6CgotIEFFR1MxOiBCUkxNTS1QCi0gQUVHUzI6IEF4aW9tR1QxCi0gQUVHUzM6IElsbHVtaW5hIEdlbm9tZVN0dWRpbwoKIyMjIFF1YWxpdHkgY29udHJvbCBhZnRlciBnZW5vdHlwaW5nCgpBZnRlciBnZW5vdHlwZSBjYWxsaW5nLCB3ZSBhZGhlcmVkIHRvIGNvbW11bml0eSBzdGFuZGFyZCBxdWFsaXR5IGNvbnRyb2wgYW5kIGFzc3VyYW5jZSAoUUNBKSBwcm9jZWR1cmVzIG9mIHRoZSBnZW5vdHlwZSBkYXRhIGZyb20gQUVHUzEsIEFFR1MyLCBhbmQgQUVHUzMuIFNhbXBsZXMgd2l0aCBsb3cgYXZlcmFnZSBnZW5vdHlwZSBjYWxsaW5nIGFuZCBzZXggZGlzY3JlcGFuY2llcyAoY29tcGFyZWQgdG8gdGhlIGNsaW5pY2FsIGRhdGEgYXZhaWxhYmxlKSB3ZXJlIGV4Y2x1ZGVkLiBUaGUgZGF0YSB3YXMgZnVydGhlciBmaWx0ZXJlZCBvbjoKCjEpIGluZGl2aWR1YWwgKHNhbXBsZSkgY2FsbCByYXRlID4gOTclLCAKMikgU05QIGNhbGwgcmF0ZSA+IDk3JSwgCjMpIG1pbm9yIGFsbGVsZSBmcmVxdWVuY2llcyAoTUFGKSA+IDMlLCAKNCkgYXZlcmFnZSBoZXRlcm96eWdvc2l0eSByYXRlIMKxIDMuMCBzLmQuLCAKNSkgcmVsYXRlZG5lc3MgKHBpLWhhdCA+IDAuMjApLCAKNikgSGFyZHnigJNXZWluYmVyZyBFcXVpbGlicml1bSAoSFdFIHAgPCAxLjDDlzEwPHN1cD7iiJIzPFxzdXA+KSwgYW5kCjcpIE1vbm9tb3JwaGljIFNOUHMgKDwgMS4ww5cxMDxzdXA+4oiSNjxcc3VwPikuIAoKQWZ0ZXIgUUNBIDIsNDkzIHNhbXBsZXMgcmVtYWluZWQsIDEwOCBvZiBub24tRXVyb3BlYW4gZGVzY2VudC9hbmNlc3RyeSwgYW5kIDE1NiByZWxhdGVkIHBhaXJzLiAgVGhlc2UgY29tcHJpc2UgODkwIHNhbXBsZXMgYW5kIDQwNyw3MTIgU05QcyBpbiBBRUdTMSwgODY5IHNhbXBsZXMgYW5kIDUzNCw1MDggU05QcyBpbiBBRUdTMiwgYW5kIDY0OTk1NCBzYW1wbGVzIGFuZCA1MzQsNTA4IFNOUHMgaW4gQUVHUzMgcmVtYWluZWQuCgojIyMgSW1wdXRhdGlvbgoKQmVmb3JlIHBoYXNpbmcgdXNpbmcgU0hBUEVJVDIsIGRhdGEgd2FzIGxpZnRlZCB0byBnZW5vbWUgYnVpbGQgYjM3IHVzaW5nIHRoZSBsaWZ0T3ZlciB0b29sIGZyb20gVUNTQyAoaHR0cHM6Ly9nZW5vbWUudWNzYy5lZHUvY2dpLWJpbi9oZ0xpZnRPdmVyKS4gRmluYWxseSwgZGF0YSB3YXMgaW1wdXRlZCB3aXRoIDEwMDBHIHBoYXNlIDMsIHZlcnNpb24gNSBhbmQgSFJDIHJlbGVhc2UgMS4xIGFzIGEgcmVmZXJlbmNlIHVzaW5nIHRoZSBbTWljaGlnYW4gSW1wdXRhdGlvbiBTZXJ2ZXJdKGh0dHBzOi8vaW1wdXRhdGlvbnNlcnZlci5zcGgudW1pY2guZWR1Lyl7dGFyZ2V0PSJfYmxhbmsifS4gVGhlc2UgcmVzdWx0cyB3ZXJlIGZ1cnRoZXIgaW50ZWdyYXRlZCB1c2luZyBRQ1RPT0wgdjIsIHdoZXJlIEhSQyBpbXB1dGVkIHZhcmlhbnRzIGFyZSBnaXZlbiBwcmVjZW5kZW5jZSBvdmVyIDEwMDBHIHBoYXNlIDMgaW1wdXRlZCB2YXJpYW50cy4gCgojIyMgUXVhbGl0eSBjb250cm9sIGFmdGVyIGltcHV0YXRpb24KCldlIGNvbXBhcmVkIHF1YWxpdHkgb2YgdGhlIHRocmVlIEFFR1MgZGF0YXNldHMsIGFuZCBsaXN0ZWQgc29tZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QuCgotIHNhbXBsZSB0eXBlIChFRFRBIGJsb29kIG9yIHBsYXF1ZSkKLSBnZW5vdHlwaW5nIGNoaXAgdXNlZAotIHJlYXNvbiBmb3IgZmlsdGVyaW5nCgpXZSBjaGVja2VkIHRoZSBzdHVkeXR5cGUgKEFFIG9yIG5vdCksIGFuZCBfaWRlbnRpdHktYnktZGVzY2VudCAoSUJEKV8gd2l0aGluIGFuZCBiZXR3ZWVuIGRhdGFzZXRzIHRvIGFpZCBpbiBzYW1wbGUgbWl4dXBzLCBkdXBsaWNhdGUgc2FtcGxlIHVzZSwgYW5kIHJlbGF0ZWRuZXNzLiBJbiBhZGRpdGlvbiwgZHVyaW5nIGdlbm90eXBpbmcgcXVhbGl0eSBjb250cm9sIHNhbXBsZXMgd2VyZSBpZGVudGlmaWVkIHRoYXQgZGV2aWF0ZWQgZnJvbSBfSGFyZHktV2VpbmJlcmcgRXF1aWxpYnJpdW0gKEhXRSlfLCBoYWQgZGlzY29yZGFuY2UgaW4gc2V4LWNvZGluZyBhbmQgZ2Vub3R5cGUgc2V4LCBhbmQgZGV2aWF0ZWQgZnJvbSB0aGUgX3ByaW5jaXBhbCBjb21wb25lbnQgYW5hbHlzaXMgKFBDQSlfIHBsb3QuCgpXZSB3aWxsIGxvYWQgdGhlIEF0aGVyby1FeHByZXNzIEJpb2JhbmsgU3R1ZHkgZGF0YSwgYW5kIGFsbCB0aGUgc2FtcGxlcyB0aGF0IHdlcmUgc2VuZCBmb3IgZ2Vub3R5cGluZyBhbmQgdGhlIGZpbmFsIFFDJ2VkIHNhbXBsZUxpc3QuCgojIyBMb2FkaW5nIGRhdGEKCkxvYWRpbmcgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBTdHVkeSBjbGluaWNhbCBhbmQgYmlvYmFuayBkYXRhLCBhcyB3ZWxsIGFzIHRoZSBTYW1wbGVMaXN0IG9mIGdlbmV0aWMgZGF0YS4KYGBge3IgTG9hZEFFREJ9CmNhdCgiKiBnZXQgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBTdHVkeSBEYXRhYmFzZS4uLiIpCiMgTUVUSE9EIDE6IEl0IHNlZW1zIHRoaXMgbWV0aG9kIGdpdmVzIGxvYWRzIG9mIGVycm9ycyBhbmQgd2FybmluZ3MsIHdoaWNoIGFsbCBhcmUgaGFyZCB0byBjb21wcmVoZW5kCiMgICAgICAgICAgIG9yIGRlYnVnLiBXZSBleHBlY3QgMyw1Mjcgc2FtcGxlcywgYW5kIDkyNyB2YXJpYWJsZXM7IHdlIGdldCA5MjcgdmFyaWFibGVzISEhCiMgQUVkYXRhID0gYXMuZGF0YS50YWJsZShyZWFkLnNwc3MocGFzdGUwKElOUF9sb2MsIi8yMDE3LTFORVdfQXRoZXJvRXhwcmVzc0RhdGFiYXNlX1NjaWVudGlmaWNBRV8yMDE3MTMwNl92MS4wLnNhdiIpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaW0uZmFjdG9yLm5hbWVzID0gVFJVRSwgdHJpbV92YWx1ZXMgPSBUUlVFLCAjIHdlIHRyaW0gc3BhY2VzIGluIHZhbHVlcwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZW5jb2RlID0gVFJVRSwgIyB3ZSByZS1lbmNvZGUgdG8gdGhlIGxvY2FsIGxvY2FsZSBlbmNvZGluZwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZC51bmRlY2xhcmVkLmxldmVscyA9ICJhcHBlbmQiLCAjIHdlIGRvICpub3QqIHdhbnQgdG8gY29udmVydCB0byBSLWZhY3RvcnMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UudmFsdWUubGFiZWxzID0gRkFMU0UsICMgd2UgZG8gKm5vdCogY29udmVydCB2YXJpYWJsZXMgd2l0aCB2YWx1ZSBsYWJlbHMgaW50byBSIGZhY3RvcnMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UubWlzc2luZ3MgPSBUUlVFLCBzdWIgPSAiTkEiLCAjIHdlIHdpbGwgc2V0IGV2ZXJ5IG1pc3NpbmcgdmFyaWFibGUgdG8gTkEKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkLnZhbHVlLmxhYmVscyA9ICJjb25kZW5zZSIsICMgd2Ugd2lsbCBjb25kZW5zZSBkdXBsaWNhdGVkIHZhbHVlIGxhYmVscwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvLmRhdGEuZnJhbWUgPSBUUlVFKSkKIyBBRWRhdGEubGFiZWxzIDwtIGFzLmRhdGEudGFibGUoYXR0cihBRWRhdGEsICJ2YXJpYWJsZS5sYWJlbHMiKSkKIyBuYW1lcyhBRWRhdGEubGFiZWxzKSA8LSAiVmFyaWFibGUiCgojIE1FVEhPRCAyOiBVc2luZyBsaWJyYXJ5KCJoYXZlbiIpIGltcG9ydGluZyBzZWVtcyBmbGF3bGVzczsgYmVzdCBhcmd1bWVudCBiZWluZzoKIyAgICAgICAgICAgd2UgZXhwZWN0IDMsNTI3IHNhbXBsZXMgYW5kIDg4OCB2YXJpYWJsZXMsIHdoaWNoIGlzIHdoYXQgeW91J2QgZ2V0IHdpdGggdGhpcyBtZXRob2QKIyAgICAgICAgICAgU28gZm9yIG5vdywgTUVUSE9EIDIgaXMgcHJlZmVyZWQuIAojICAgICAgICAgICAgCnJlcXVpcmUoaGF2ZW4pCgojIEFFREIgPC0gaGF2ZW46OnJlYWRfc2F2KHBhc3RlMChBRURCX2xvYywgIi8yMDE5LTNORVdfQXRoZXJvRXhwcmVzc0RhdGFiYXNlX1NjaWVudGlmaWNBRV8wMjA3MjAxOV9JQ19hZGRlZC5zYXYiKSkKQUVEQiA8LSBoYXZlbjo6cmVhZF9zYXYocGFzdGUwKEFFREJfbG9jLCAiLzIwMjBfMV9ORVdfQXRoZXJvRXhwcmVzc0RhdGFiYXNlX1NjaWVudGlmaWNBRV8xNi0wMy0yMDIwLnNhdiIpKQoKIyB3cml0aW5nIG9mZiB0aGUgU1BTUyBkYXRhIHRvIGFuIEV4Y2VsLgojIGZ3cml0ZShBRWRhdGEsIGZpbGUgPSBwYXN0ZTAoSU5QX2xvYywiLzIwMTctMU5FV19BdGhlcm9FeHByZXNzRGF0YWJhc2VfU2NpZW50aWZpY0FFXzIwMTcxMzA2X3YxLjAudmFsdWVzLnhsc3giKSwgCiMgICAgICAgIHNlcCA9ICI7IiwgbmEgPSAiTkEiLCBkZWMgPSAiLiIsIGNvbC5uYW1lcyA9IFRSVUUsIHJvdy5uYW1lcyA9IEZBTFNFLAojICAgICAgICBkYXRlVGltZUFzID0gIklTTyIsIHNob3dQcm9ncmVzcyA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFKQojIHdhcm5pbmdzKCkKCkFFREJbMToxMCwgMToxMF0KZGltKEFFREIpCgpjYXQoIiogZ2V0IEF0aGVyby1FeHByZXNzIEdlbm9taWNzIFN0dWR5IGtleXMuLi4iKQpBRUdTMTIzLnNhbXBsZUxpc3Qua2V5dGFibGUgPC0gZnJlYWQocGFzdGUwKEFFR1NRQ19sb2MsICIvUUMvU0VMRUNUSU9OUy8yMDIwMDMxOS5RQy5BRUdTMTIzLnNhbXBsZUxpc3Qua2V5dGFibGUudHh0IikpCgpkaW0oQUVHUzEyMy5zYW1wbGVMaXN0LmtleXRhYmxlKQojIEFFR1MxMjMuc2FtcGxlTGlzdC5rZXl0YWJsZVsxOjEwLCAxOjEwXQoKCmBgYAoKIyMjIyBFeGFtaW5lIEFFREIKCldlIGNhbiBleGFtaW5lIHRoZSBjb250ZW50cyBvZiB0aGUgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBkYXRhc2V0IHRvIGtub3cgd2hhdCBlYWNoIHZhcmlhYmxlIGlzIGNhbGxlZCwgd2hhdCBjbGFzcyAodHlwZSkgaXQgaGFzLCBhbmQgd2hhdCB0aGUgdmFyaWFibGUgZGVzY3JpcHRpb24gaXMuIAoKVGhlcmUgaXMgYW4gZXhjZWxsZW50IHBvc3Qgb24gdGhpczogaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vd29ya2luZy13aXRoLXNwc3MtbGFiZWxzLWluLXIvLiAKYGBge3IgQUVEQjogZGVzY3JpYmV9CkFFREIgJT4lIHNqUGxvdDo6dmlld19kZihzaG93LnR5cGUgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy5mcnEgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy5wcmMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy5uYSA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgbWF4LmxlbiA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgd3JhcC5sYWJlbHMgPSAyMCwKICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICB1c2Uudmlld2VyID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuQUVEQi5kaWN0aW9uYXJ5Lmh0bWwiKSkgCmBgYAoKCiMjIyBGaXggY2xpbmljYWwgZGF0YQoKV2UgbmVlZCB0byBiZSB2ZXJ5IHN0cmljdCBpbiBkZWZpbmluZyBfc3ltcHRvbXMuXyBUaGVyZWZvcmUgd2Ugd2lsbCBmaXggYSBuZXcgdmFyaWFibGUgdGhhdCBncm91cHMgX3N5bXB0b21zXyBhdCBpbmNsdXNpb24uCgpDb2Rpbmcgb2YgX3N5bXB0b21zXyBpcyBhcyBmb2xsb3dzOgoKLSBtaXNzaW5nCS05OTkJCi0gQXN5bXB0b21hdGljCTAJCi0gVElBCTEJCi0gbWlub3Igc3Ryb2tlCTIJCi0gTWFqb3Igc3Ryb2tlCTMJCi0gQW1hdXJvc2lzIGZ1Z2F4CTQJCi0gRm91ciB2ZXNzZWwgZGlzZWFzZQk1CQotIFZlcnRlYnJvYmFzaWxhcnkgVElBCTcJCi0gUmV0aW5hbCBpbmZhcmN0aW9uCTgJCi0gU3ltcHRvbWF0aWMsIGJ1dCBhc3BlY2lmaWMgc3ltdG9tcwk5Ci0gQ29udHJhbGF0ZXJhbCBzeW1wdG9tYXRpYyBvY2NsdXNpb24JMTAJCi0gcmV0aW5hbCBpbmZhcmN0aW9uCTExCQotIGFybWNsYXVkaWNhdGlvbiBkdWUgdG8gb2NjbHVzaW9uIHN1YmNsYXZpYW4gYXJ0ZXJ5LCBDRUEgbmVlZGVkIGZvciBieXBhc3MJMTIJCi0gcmV0aW5hbCBpbmZhcmN0aW9uICsgVElBcwkxMwkKLSBPY3VsYXIgaXNjaGVtaWMgc3luZHJvbWUJMTQJCi0gaXNjaGVtaXNjaCBnbGF1Y29vbQkxNQkKLSBzdWJjbGF2aWFuIHN0ZWFsIHN5bmRyb21lCTE2CQotIFRHQQkxNwoKV2Ugd2lsbCBncm91cCBhcyBmb2xsb3dzOgoKMS4gQXN5bXB0b21hdGljID4gMAoyLiBUSUEgPiAxLCA3LCAxMwozLiBTdHJva2UgPiAyLCAzCjQuIE9jdWxhciA+IDQsIDE0LCAxNQo1LiBSZXRpbmFsIGluZmFyY3Rpb24gPiA4LCAxMQo2LiBPdGhlciA+IDUsIDksIDEwLCAxMiwgMTYsIDE3CgoKYGBge3IgRml4U3ltcHRvbXN9CgojIEZpeCBzeW1wdG9tcwoKYXR0YWNoKEFFREIpCkFFREJbLCJTeW1wdG9tcy41RyJdIDwtIE5BCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gMF0gPC0gIkFzeW1wdG9tYXRpYyIKQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSAxIHwgc3ltcHQgPT0gNyB8IHN5bXB0ID09IDEzXSA8LSAiVElBIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IDIgfCBzeW1wdCA9PSAzXSA8LSAiU3Ryb2tlIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IDQgfCBzeW1wdCA9PSAxNCB8IHN5bXB0ID09IDE1IF0gPC0gIk9jdWxhciIKQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSA4IHwgc3ltcHQgPT0gMTFdIDwtICJSZXRpbmFsIGluZmFyY3Rpb24iCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gNSB8IHN5bXB0ID09IDkgfCBzeW1wdCA9PSAxMCB8IHN5bXB0ID09IDEyIHwgc3ltcHQgPT0gMTYgfCBzeW1wdCA9PSAxN10gPC0gIk90aGVyIgoKCiMgQXN5bXB0U3ltcHQKQUVEQlssIkFzeW1wdFN5bXB0Il0gPC0gTkEKQUVEQiRBc3ltcHRTeW1wdFtzeW1wdCA9PSAtOTk5XSA8LSBOQQpBRURCJEFzeW1wdFN5bXB0W3N5bXB0ID09IDBdIDwtICJBc3ltcHRvbWF0aWMiCkFFREIkQXN5bXB0U3ltcHRbc3ltcHQgPT0gMSB8IHN5bXB0ID09IDcgfCBzeW1wdCA9PSAxMyB8IHN5bXB0ID09IDIgfCBzeW1wdCA9PSAzXSA8LSAiU3ltcHRvbWF0aWMiCkFFREIkQXN5bXB0U3ltcHRbc3ltcHQgPT0gNCB8IHN5bXB0ID09IDE0IHwgc3ltcHQgPT0gMTUgfCBzeW1wdCA9PSA4IHwgc3ltcHQgPT0gMTEgfCBzeW1wdCA9PSA1IHwgc3ltcHQgPT0gOSB8IHN5bXB0ID09IDEwIHwgc3ltcHQgPT0gMTIgfCBzeW1wdCA9PSAxNiB8IHN5bXB0ID09IDE3XSA8LSAiT2N1bGFyIGFuZCBvdGhlcnMiCgojIEFzeW1wdFN5bXB0CkFFREJbLCJBc3ltcHRTeW1wdDJHIl0gPC0gTkEKQUVEQiRBc3ltcHRTeW1wdDJHW3N5bXB0ID09IC05OTldIDwtIE5BCkFFREIkQXN5bXB0U3ltcHQyR1tzeW1wdCA9PSAwXSA8LSAiQXN5bXB0b21hdGljIgpBRURCJEFzeW1wdFN5bXB0Mkdbc3ltcHQgPT0gMSB8IHN5bXB0ID09IDcgfCBzeW1wdCA9PSAxMyB8IHN5bXB0ID09IDIgfCBzeW1wdCA9PSAzIHwgc3ltcHQgPT0gNCB8IHN5bXB0ID09IDE0IHwgc3ltcHQgPT0gMTUgfCBzeW1wdCA9PSA4IHwgc3ltcHQgPT0gMTEgfCBzeW1wdCA9PSA1IHwgc3ltcHQgPT0gOSB8IHN5bXB0ID09IDEwIHwgc3ltcHQgPT0gMTIgfCBzeW1wdCA9PSAxNiB8IHN5bXB0ID09IDE3XSA8LSAiU3ltcHRvbWF0aWMiCgpkZXRhY2goQUVEQikKCiMgdGFibGUoQUVEQiRzeW1wdCwgdXNlTkEgPSAiaWZhbnkiKQojIHRhYmxlKEFFREIkQXN5bXB0U3ltcHQyRywgdXNlTkEgPSAiaWZhbnkiKQojIHRhYmxlKEFFREIkU3ltcHRvbXMuNUcsIHVzZU5BID0gImlmYW55IikKIyAKIyB0YWJsZShBRURCJEFzeW1wdFN5bXB0MkcsIEFFREIkc3ltcHQsIHVzZU5BID0gImlmYW55IikKIyB0YWJsZShBRURCJFN5bXB0b21zLjVHLCBBRURCJHN5bXB0LCB1c2VOQSA9ICJpZmFueSIpCnRhYmxlKEFFREIkQXN5bXB0U3ltcHQyRywgQUVEQiRTeW1wdG9tcy41RywgdXNlTkEgPSAiaWZhbnkiKQoKIyBBRURCLnRlbXAgPC0gc3Vic2V0KEFFREIsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgInN5bXB0IiwgIlN5bXB0b21zLjVHIiwgIkFzeW1wdFN5bXB0IikpCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQojIEFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQojIEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQojIAojIERUOjpkYXRhdGFibGUoQUVEQi50ZW1wWzE6MTAsXSwgY2FwdGlvbiA9ICJFeGNlcnB0IG9mIHRoZSB3aG9sZSBBRURCLiIsIHJvd25hbWVzID0gRkFMU0UpCiMgCiMgdGFibGUoQUVEQi50ZW1wJFN5bXB0b21zLjVHLCBBRURCLnRlbXAkQXN5bXB0U3ltcHQpCiMgCiMgcm0oQUVEQi50ZW1wKQpgYGAKCldlIHdpbGwgYWxzbyBmaXggdGhlIF9wbGFxdWVwaGVub3R5cGVzXyB2YXJpYWJsZS4gIAoKQ29kaW5nIG9mIHN5bXB0b21zIGlzIGFzIGZvbGxvd3M6CgotIG1pc3NpbmcJLTk5OQkKLSBub3QgcmVsZXZhbnQgLTg4OAotIGZpYnJvdXMJMQkKLSBmaWJyb2F0aGVyb21hdG91cwkyCQotIGF0aGVyb21hdG91cwkzCQoKCmBgYHtyIEZpeFBsYXF1ZVBoZW5vdHlwZXN9CgojIEZpeCBwbGFxdWVwaGVub3R5cGVzCmF0dGFjaChBRURCKQpBRURCWywiT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSJdIDwtIE5BCkFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZVtwbGFxdWVwaGVub3R5cGUgPT0gLTk5OV0gPC0gTkEKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlW3BsYXF1ZXBoZW5vdHlwZSA9PSAtOTk5XSA8LSBOQQpBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGVbcGxhcXVlcGhlbm90eXBlID09IDFdIDwtICJmaWJyb3VzIgpBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGVbcGxhcXVlcGhlbm90eXBlID09IDJdIDwtICJmaWJyb2F0aGVyb21hdG91cyIKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlW3BsYXF1ZXBoZW5vdHlwZSA9PSAzXSA8LSAiYXRoZXJvbWF0b3VzIgpkZXRhY2goQUVEQikKCiMgQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJwbGFxdWVwaGVub3R5cGUiLCAiT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSIpKQojIHJlcXVpcmUobGFiZWxsZWQpCiMgQUVEQi50ZW1wJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEdlbmRlcikKIyBBRURCLnRlbXAkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRIb3NwaXRhbCkKIyBBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSkKIyAKIyBEVDo6ZGF0YXRhYmxlKEFFREIudGVtcFsxOjEwLF0sIGNhcHRpb24gPSAiRXhjZXJwdCBvZiB0aGUgd2hvbGUgQUVEQi4iLCByb3duYW1lcyA9IEZBTFNFKQojIAojIHJtKEFFREIudGVtcCkKCmBgYAoKV2Ugd2lsbCBhbHNvIGZpeCB0aGUgX2RpYWJldGVzXyBzdGF0dXMgdmFyaWFibGUuCgpgYGB7ciBGaXhEaWFiZXRlc30KCiMgRml4IGRpYWJldGVzCmF0dGFjaChBRURCKQpBRURCWywiRGlhYmV0ZXNTdGF0dXMiXSA8LSBOQQpBRURCJERpYWJldGVzU3RhdHVzW0RNLmNvbXBvc2l0ZSA9PSAtOTk5XSA8LSBOQQpBRURCJERpYWJldGVzU3RhdHVzW0RNLmNvbXBvc2l0ZSA9PSAwXSA8LSAiQ29udHJvbCAobm8gRGlhYmV0ZXMgRHgvTWVkKSIKQUVEQiREaWFiZXRlc1N0YXR1c1tETS5jb21wb3NpdGUgPT0gMV0gPC0gIkRpYWJldGVzIgpkZXRhY2goQUVEQikKCiMgQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJETS5jb21wb3NpdGUiLCAiRGlhYmV0ZXNTdGF0dXMiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgQUVEQi50ZW1wJERpYWJldGVzU3RhdHVzIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkRGlhYmV0ZXNTdGF0dXMpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgpgYGAKCgpXZSB3aWxsIGFsc28gZml4IHRoZSBfc21va2luZ18gc3RhdHVzIHZhcmlhYmxlLiBXZSBhcmUgaW50ZXJlc3RlZCBpbiB3aGV0aGVyIHNvbWVvbmUgbmV2ZXIsIGV2ZXIgb3IgaXMgY3VycmVudGx5IChhdCB0aGUgdGltZSBvZiBpbmNsdXNpb24pIHNtb2tpbmcuIFRoaXMgaXMgYmFzZWQgb24gdGhlIHF1ZXN0aW9ubmFpcmUuIAoKLSBgZGlldDgwMWA6IGFyZSB5b3UgYSBzbW9rZXI/Ci0gYGRpZXQ4MDJgOiBkaWQgeW91IHNtb2tlIGluIHRoZSBwYXN0PwoKV2UgYWxyZWFkeSBoYXZlIHNvbWUgdmFyaWFibGVzIGluZGljYXRpbmcgc21va2luZyBzdGF0dXM6CgotIGBTbW9raW5nUmVwb3J0ZWRgOiBwYXRpZW50IGhhcyByZXBvcnRlZCB0byBzbW9rZS4KLSBgU21va2luZ1llYXJPUmA6IHNtb2tpbmcgaW4gdGhlIHllYXIgb2Ygc3VyZ2VyeT8KLSBgU21va2VyQ3VycmVudGA6IGN1cnJlbnRseSBzbW9raW5nPwoKCgpgYGB7ciBGaXhTbW9raW5nfQpyZXF1aXJlKGxhYmVsbGVkKQpBRURCJGRpZXQ4MDEgPC0gdG9fZmFjdG9yKEFFREIkZGlldDgwMSkKQUVEQiRkaWV0ODAyIDwtIHRvX2ZhY3RvcihBRURCJGRpZXQ4MDIpCkFFREIkZGlldDgwNSA8LSB0b19mYWN0b3IoQUVEQiRkaWV0ODA1KQpBRURCJFNtb2tpbmdSZXBvcnRlZCA8LSB0b19mYWN0b3IoQUVEQiRTbW9raW5nUmVwb3J0ZWQpCkFFREIkU21va2VyQ3VycmVudCA8LSB0b19mYWN0b3IoQUVEQiRTbW9rZXJDdXJyZW50KQpBRURCJFNtb2tpbmdZZWFyT1IgPC0gdG9fZmFjdG9yKEFFREIkU21va2luZ1llYXJPUikKCiMgdGFibGUoQUVEQiRkaWV0ODAxKQojIHRhYmxlKEFFREIkZGlldDgwMikKIyB0YWJsZShBRURCJFNtb2tpbmdSZXBvcnRlZCkKIyB0YWJsZShBRURCJFNtb2tlckN1cnJlbnQpCiMgdGFibGUoQUVEQiRTbW9raW5nWWVhck9SKQojIHRhYmxlKEFFREIkU21va2luZ1JlcG9ydGVkLCBBRURCJFNtb2tlckN1cnJlbnQsIHVzZU5BID0gImlmYW55IiwgZG5uID0gYygiUmVwb3J0ZWQgc21va2luZyIsICJDdXJyZW50IHNtb2tlciIpKQojIAojIHRhYmxlKEFFREIkZGlldDgwMSwgQUVEQiRkaWV0ODAyLCB1c2VOQSA9ICJpZmFueSIsIGRubiA9IGMoIlNtb2tlciIsICJQYXN0IHNtb2tlciIpKQoKY2F0KCJcbkZpeGluZyBzbW9raW5nIHN0YXR1cy5cbiIpCmF0dGFjaChBRURCKQpBRURCWywiU21va2VyU3RhdHVzIl0gPC0gTkEKQUVEQiRTbW9rZXJTdGF0dXNbZGlldDgwMiA9PSAiZG9uJ3Qga25vdyJdIDwtICJOZXZlciBzbW9rZWQiCkFFREIkU21va2VyU3RhdHVzW2RpZXQ4MDIgPT0gIkkgc3RpbGwgc21va2UiXSA8LSAiQ3VycmVudCBzbW9rZXIiCkFFREIkU21va2VyU3RhdHVzW1Ntb2tlckN1cnJlbnQgPT0gIm5vIiAmIGRpZXQ4MDIgPT0gIm5vIl0gPC0gIk5ldmVyIHNtb2tlZCIKQUVEQiRTbW9rZXJTdGF0dXNbU21va2VyQ3VycmVudCA9PSAibm8iICYgZGlldDgwMiA9PSAieWVzIl0gPC0gIkV4LXNtb2tlciIKQUVEQiRTbW9rZXJTdGF0dXNbU21va2VyQ3VycmVudCA9PSAieWVzIl0gPC0gIkN1cnJlbnQgc21va2VyIgpBRURCJFNtb2tlclN0YXR1c1tTbW9rZXJDdXJyZW50ID09ICJubyBkYXRhIGF2YWlsYWJsZS9taXNzaW5nIl0gPC0gTkEKIyBBRURCJFNtb2tlclN0YXR1c1tpcy5uYShTbW9rZXJDdXJyZW50KV0gPC0gIk5ldmVyIHNtb2tlZCIKZGV0YWNoKEFFREIpCgpjYXQoIlxuKiBDdXJyZW50IHNtb2tpbmcgc3RhdHVzLlxuIikKdGFibGUoQUVEQiRTbW9rZXJDdXJyZW50LAogICAgICB1c2VOQSA9ICJpZmFueSIsIAogICAgICBkbm4gPSBjKCJDdXJyZW50IHNtb2tlciIpKQoKY2F0KCJcbiogVXBkYXRlZCBzbW9raW5nIHN0YXR1cy5cbiIpCnRhYmxlKEFFREIkU21va2VyU3RhdHVzLAogICAgICB1c2VOQSA9ICJpZmFueSIsIAogICAgICBkbm4gPSBjKCJVcGRhdGVkIHNtb2tpbmcgc3RhdHVzIikpCgpjYXQoIlxuKiBDb21wYXJpbmcgdG8gJ1Ntb2tlckN1cnJlbnQnLlxuIikKdGFibGUoQUVEQiRTbW9rZXJTdGF0dXMsIEFFREIkU21va2VyQ3VycmVudCwgCiAgICAgIHVzZU5BID0gImlmYW55IiwgCiAgICAgIGRubiA9IGMoIlVwZGF0ZWQgc21va2luZyBzdGF0dXMiLCAiQ3VycmVudCBzbW9rZXIiKSkKCiMgQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJETS5jb21wb3NpdGUiLCAiRGlhYmV0ZXNTdGF0dXMiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgQUVEQi50ZW1wJERpYWJldGVzU3RhdHVzIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkRGlhYmV0ZXNTdGF0dXMpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgoKYGBgCgpXZSB3aWxsIGFsc28gZml4IHRoZSBfYWxjb2hvbF8gc3RhdHVzIHZhcmlhYmxlLgoKCmBgYHtyIEZpeEFsY29ob2x9CgojIEZpeCBkaWFiZXRlcwphdHRhY2goQUVEQikKQUVEQlssIkFsY29ob2xVc2UiXSA8LSBOQQpBRURCJEFsY29ob2xVc2VbZGlldDgxMCA9PSAtOTk5XSA8LSBOQQpBRURCJEFsY29ob2xVc2VbZGlldDgxMCA9PSAwXSA8LSAiTm8iCkFFREIkQWxjb2hvbFVzZVtkaWV0ODEwID09IDFdIDwtICJZZXMiCmRldGFjaChBRURCKQoKIyBBRURCLnRlbXAgPC0gc3Vic2V0KEFFREIsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgImRpZXQ4MTAiLCAiQWxjb2hvbFVzZSIpKQojIHJlcXVpcmUobGFiZWxsZWQpCiMgQUVEQi50ZW1wJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEdlbmRlcikKIyBBRURCLnRlbXAkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRIb3NwaXRhbCkKIyBBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSkKIyBBRURCLnRlbXAkQWxjb2hvbFVzZSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFsY29ob2xVc2UpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgoKYGBgCgoKV2Ugd2lsbCBhbHNvIGZpeCBhbmQgaW52ZXJzZS1yYW5rIG5vcm1hbCB0cmFuc2Zvcm0gdGhlIGNvbnRpbnVvdXMgKG1hbnVhbGx5KSBzY29yZWQgcGxhcXVlIHBoZW5vdHlwZXMuCgpgYGB7ciBJUk5UIFBsYXF1ZVBoZW5vdHlwZXN9CkFFREIkbWFjbWVhbjAgPC0gYXMubnVtZXJpYyhBRURCJG1hY21lYW4wKQpBRURCJHNtY21lYW4wIDwtIGFzLm51bWVyaWMoQUVEQiRzbWNtZWFuMCkKQUVEQiRuZXV0cm9waGlscyA8LSBhcy5udW1lcmljKEFFREIkbmV1dHJvcGhpbHMpCkFFREIkTWFzdF9jZWxsc19wbGFxdWUgPC0gYXMubnVtZXJpYyhBRURCJE1hc3RfY2VsbHNfcGxhcXVlKQpBRURCJHZlc3NlbF9kZW5zaXR5X2F2ZXJhZ2VkIDwtIGFzLm51bWVyaWMoQUVEQiR2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCkKCkFFREIkTUFDX3JhbmtOb3JtIDwtIHFub3JtKChyYW5rKEFFREIkbWFjbWVhbjAsIG5hLmxhc3QgPSAia2VlcCIpIC0gMC41KSAvIHN1bSghaXMubmEoQUVEQiRtYWNtZWFuMCkpKQpBRURCJFNNQ19yYW5rTm9ybSA8LSBxbm9ybSgocmFuayhBRURCJHNtY21lYW4wLCBuYS5sYXN0ID0gImtlZXAiKSAtIDAuNSkgLyBzdW0oIWlzLm5hKEFFREIkc21jbWVhbjApKSkKQUVEQiROZXV0cm9waGlsc19yYW5rTm9ybSA8LSBxbm9ybSgocmFuayhBRURCJG5ldXRyb3BoaWxzLCBuYS5sYXN0ID0gImtlZXAiKSAtIDAuNSkgLyBzdW0oIWlzLm5hKEFFREIkbmV1dHJvcGhpbHMpKSkKQUVEQiRNYXN0Q2VsbHNfcmFua05vcm0gPC0gcW5vcm0oKHJhbmsoQUVEQiRNYXN0X2NlbGxzX3BsYXF1ZSwgbmEubGFzdCA9ICJrZWVwIikgLSAwLjUpIC8gc3VtKCFpcy5uYShBRURCJE1hc3RfY2VsbHNfcGxhcXVlKSkpCkFFREIkVmVzc2VsRGVuc2l0eV9yYW5rTm9ybSA8LSBxbm9ybSgocmFuayhBRURCJHZlc3NlbF9kZW5zaXR5X2F2ZXJhZ2VkLCBuYS5sYXN0ID0gImtlZXAiKSAtIDAuNSkgLyBzdW0oIWlzLm5hKEFFREIkdmVzc2VsX2RlbnNpdHlfYXZlcmFnZWQpKSkKCmBgYAoKCmBgYHtyIElSTlQgUGxhcXVlUGhlbm90eXBlczogVmlzdWFsaXNhdGlvbn0KbGlicmFyeShsYWJlbGxlZCkKQUVEQiRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIkR2VuZGVyKQpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJtYWNtZWFuMCIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiJSBvZiBtYWNyb3BoYWdlcyAoQ0Q2OCkiLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiJSBwZXIgcmVnaW9uIG9mIGludGVyZXN0IiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCmdncHVicjo6Z2doaXN0b2dyYW0oQUVEQiwgIk1BQ19yYW5rTm9ybSIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiJSBvZiBtYWNyb3BoYWdlcyAoQ0Q2OCkiLAogICAgICAgICAgICAgICAgICAgeGxhYiA9ICIlIHBlciByZWdpb24gb2YgaW50ZXJlc3RcbmludmVyc2UtcmFuayBub3JtYWxpemVkIG51bWJlciIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJzbWNtZWFuMCIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiJSBvZiBzbW9vdGggbXVzY2xlIGNlbGxzIChTTUEpIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gIiUgcGVyIHJlZ2lvbiBvZiBpbnRlcmVzdCIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJTTUNfcmFua05vcm0iLCAKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwgCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksIAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWRpYW4iLCAKICAgICAgICAgICAgICAgICAgICAjYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgI2FkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksIAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiUgb2Ygc21vb3RoIG11c2NsZSBjZWxscyAoU01BKSIsCiAgICAgICAgICAgICAgICAgICB4bGFiID0gIiUgcGVyIHJlZ2lvbiBvZiBpbnRlcmVzdFxuaW52ZXJzZS1yYW5rIG5vcm1hbGl6ZWQgbnVtYmVyIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCmdncHVicjo6Z2doaXN0b2dyYW0oQUVEQiwgIm5ldXRyb3BoaWxzIiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVkaWFuIiwgCiAgICAgICAgICAgICAgICAgICAgI2FkZF9kZW5zaXR5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICNhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJudW1iZXIgb2YgbmV1dHJvcGhpbHMgKENENjZiKSIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjb3VudHMgcGVyIHBsYXF1ZSIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJOZXV0cm9waGlsc19yYW5rTm9ybSIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAibnVtYmVyIG9mIG5ldXRyb3BoaWxzIChDRDY2YikiLAogICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjb3VudHMgcGVyIHBsYXF1ZVxuaW52ZXJzZS1yYW5rIG5vcm1hbGl6ZWQgbnVtYmVyIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCmdncHVicjo6Z2doaXN0b2dyYW0oQUVEQiwgIk1hc3RfY2VsbHNfcGxhcXVlIiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVkaWFuIiwgCiAgICAgICAgICAgICAgICAgICAgI2FkZF9kZW5zaXR5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICNhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJudW1iZXIgb2YgbWFzdCBjZWxscyIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjb3VudHMgcGVyIHBsYXF1ZSIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJNYXN0Q2VsbHNfcmFua05vcm0iLCAKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwgCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksIAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWRpYW4iLCAKICAgICAgICAgICAgICAgICAgICAjYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgI2FkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksIAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIm51bWJlciBvZiBtYXN0IGNlbGxzIiwKICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiY291bnRzIHBlciBwbGFxdWVcbmludmVyc2UtcmFuayBub3JtYWxpemVkIG51bWJlciIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJ2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAibnVtYmVyIG9mIGludHJhcGxhcXVlIG5lb3Zlc3NlbHMiLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiY291bnRzIHBlciAzLTQgaG90c3BvdHMiLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRURCLCAiVmVzc2VsRGVuc2l0eV9yYW5rTm9ybSIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAibnVtYmVyIG9mIGludHJhcGxhcXVlIG5lb3Zlc3NlbHMiLAogICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjb3VudHMgcGVyIDMtNCBob3RzcG90c1xuaW52ZXJzZS1yYW5rIG5vcm1hbGl6ZWQgbnVtYmVyIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKYGBgCgoKCkhlcmUgd2UgY2FsY3VsYXRlIHRoZSBfcGxhcXVlIGluc3RhYmlsaXR5L3Z1bG5lcmFiaWxpdHlfIGluZGV4CgpgYGB7ciBQbGFxdWUgVnVsbmVyYWJpbGl0eX0KIyBQbGFxdWUgdnVsbmVyYWJpbGl0eQpyZXF1aXJlKGxhYmVsbGVkKQpBRURCJE1hY3JvcGhhZ2VzLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRNYWNyb3BoYWdlcy5iaW4pCkFFREIkU01DLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRTTUMuYmluKQpBRURCJElQSC5iaW4gPC0gdG9fZmFjdG9yKEFFREIkSVBILmJpbikKQUVEQiRDYWxjLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRDYWxjLmJpbikKQUVEQiRDb2xsYWdlbi5iaW4gPC0gdG9fZmFjdG9yKEFFREIkQ29sbGFnZW4uYmluKQpBRURCJEZhdC5iaW5fMTAgPC0gdG9fZmFjdG9yKEFFREIkRmF0LmJpbl8xMCkKQUVEQiRGYXQuYmluXzQwIDwtIHRvX2ZhY3RvcihBRURCJEZhdC5iaW5fNDApCgp0YWJsZShBRURCJE1hY3JvcGhhZ2VzLmJpbikKdGFibGUoQUVEQiRGYXQuYmluXzEwKQp0YWJsZShBRURCJENvbGxhZ2VuLmJpbikKdGFibGUoQUVEQiRTTUMuYmluKQp0YWJsZShBRURCJElQSC5iaW4pCgojIFNQU1MgY29kZQoKIyAKIyAqKiogc3ludGF4LSBQbGFxdWUgdnVsbmVyYWJpbGl0eSoqLgojIENPTVBVVEUgTWFjcm9faW5zdGFiID0gLTk5OS4KIyBJRiBtYWNyb3BoYWdlcy5iaW49MiBNYWNyb19pbnN0YWI9MS4KIyBJRiBtYWNyb3BoYWdlcy5iaW49MSBNYWNyb19pbnN0YWI9MC4KIyBFWEVDVVRFLgojIAojIENPTVBVVEUgRmF0MTBfaW5zdGFiID0gLTk5OS4KIyBJRiBGYXQuYmluXzEwPTIgRmF0MTBfaW5zdGFiPTEuCiMgSUYgRmF0LmJpbl8xMD0xIEZhdDEwX2luc3RhYj0wLgojIEVYRUNVVEUuCiMgCiMgQ09NUFVURSBjb2xsX2luc3RhYj0tOTk5LgojIElGIENvbGxhZ2VuLmJpbj0yIGNvbGxfaW5zdGFiPTAuCiMgSUYgQ29sbGFnZW4uYmluPTEgY29sbF9pbnN0YWI9MS4KIyBFWEVDVVRFLgojIAojIAojIENPTVBVVEUgU01DX2luc3RhYj0tOTk5LgojIElGIFNNQy5iaW49MiBTTUNfaW5zdGFiPTAuCiMgSUYgU01DLmJpbj0xIFNNQ19pbnN0YWI9MS4KIyBFWEVDVVRFLgojIAojIENPTVBVVEUgSVBIX2luc3RhYj0tOTk5LgojIElGIElQSC5iaW49MCBJUEhfaW5zdGFiPTAuCiMgSUYgSVBILmJpbj0xIElQSF9pbnN0YWI9MS4KIyBFWEVDVVRFLgojIAojIENPTVBVVEUgSW5zdGFiaWxpdHk9TWFjcm9faW5zdGFiICsgRmF0MTBfaW5zdGFiICsgIGNvbGxfaW5zdGFiICsgU01DX2luc3RhYiArIElQSF9pbnN0YWIuCiMgRVhFQ1VURS4KCiMgRml4IHBsYXF1ZXBoZW5vdHlwZXMKYXR0YWNoKEFFREIpCiMgbWFjIGluc3RhYmlsaXR5CkFFREJbLCJNQUNfSW5zdGFiaWxpdHkiXSA8LSBOQQpBRURCJE1BQ19JbnN0YWJpbGl0eVtNYWNyb3BoYWdlcy5iaW4gPT0gLTk5OV0gPC0gTkEKQUVEQiRNQUNfSW5zdGFiaWxpdHlbTWFjcm9waGFnZXMuYmluID09ICJuby9taW5vciJdIDwtIDAKQUVEQiRNQUNfSW5zdGFiaWxpdHlbTWFjcm9waGFnZXMuYmluID09ICJtb2RlcmF0ZS9oZWF2eSJdIDwtIDEKCiMgZmF0IGluc3RhYmlsaXR5CkFFREJbLCJGQVQxMF9JbnN0YWJpbGl0eSJdIDwtIE5BCkFFREIkRkFUMTBfSW5zdGFiaWxpdHlbRmF0LmJpbl8xMCA9PSAtOTk5XSA8LSBOQQpBRURCJEZBVDEwX0luc3RhYmlsaXR5W0ZhdC5iaW5fMTAgPT0gIiA8MTAlIl0gPC0gMApBRURCJEZBVDEwX0luc3RhYmlsaXR5W0ZhdC5iaW5fMTAgPT0gIiA+MTAlIl0gPC0gMQoKIyBjb2wgaW5zdGFiaWxpdHkgCkFFREJbLCJDT0xfSW5zdGFiaWxpdHkiXSA8LSBOQQpBRURCJENPTF9JbnN0YWJpbGl0eVtDb2xsYWdlbi5iaW4gPT0gLTk5OV0gPC0gTkEKQUVEQiRDT0xfSW5zdGFiaWxpdHlbQ29sbGFnZW4uYmluID09ICJuby9taW5vciJdIDwtIDEKQUVEQiRDT0xfSW5zdGFiaWxpdHlbQ29sbGFnZW4uYmluID09ICJtb2RlcmF0ZS9oZWF2eSJdIDwtIDAKCiMgc21jIGluc3RhYmlsaXR5CkFFREJbLCJTTUNfSW5zdGFiaWxpdHkiXSA8LSBOQQpBRURCJFNNQ19JbnN0YWJpbGl0eVtTTUMuYmluID09IC05OTldIDwtIE5BCkFFREIkU01DX0luc3RhYmlsaXR5W1NNQy5iaW4gPT0gIm5vL21pbm9yIl0gPC0gMQpBRURCJFNNQ19JbnN0YWJpbGl0eVtTTUMuYmluID09ICJtb2RlcmF0ZS9oZWF2eSJdIDwtIDAKCiMgaXBoIGluc3RhYmlsaXR5CkFFREJbLCJJUEhfSW5zdGFiaWxpdHkiXSA8LSBOQQpBRURCJElQSF9JbnN0YWJpbGl0eVtJUEguYmluID09IC05OTldIDwtIE5BCkFFREIkSVBIX0luc3RhYmlsaXR5W0lQSC5iaW4gPT0gIm5vIl0gPC0gMApBRURCJElQSF9JbnN0YWJpbGl0eVtJUEguYmluID09ICJ5ZXMiXSA8LSAxCgpkZXRhY2goQUVEQikKCnRhYmxlKEFFREIkTUFDX0luc3RhYmlsaXR5LCB1c2VOQSA9ICJpZmFueSIpCnRhYmxlKEFFREIkRkFUMTBfSW5zdGFiaWxpdHksIHVzZU5BID0gImlmYW55IikKdGFibGUoQUVEQiRDT0xfSW5zdGFiaWxpdHksIHVzZU5BID0gImlmYW55IikKdGFibGUoQUVEQiRTTUNfSW5zdGFiaWxpdHksIHVzZU5BID0gImlmYW55IikKdGFibGUoQUVEQiRJUEhfSW5zdGFiaWxpdHksIHVzZU5BID0gImlmYW55IikKCiMgY3JlYXRpbmcgdnVsbmVyYWJpbGl0eSBpbmRleApBRURCIDwtIEFFREIgJT4lIG11dGF0ZShQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCA9IGZhY3Rvcihyb3dTdW1zKC5bZ3JlcCgiX0luc3RhYmlsaXR5IiwgbmFtZXMoLikpXSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKdGFibGUoQUVEQiRQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCwgdXNlTkEgPSAiaWZhbnkiKQoKIyBzdHIoQUVEQiRQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCkKCmBgYAojIyMgUHJlcGFyZSBiYXNlbGluZSBjaGFyYWN0ZXJpc3RpY3MKCldlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGF0IGJhc2VsaW5lLgoKLSBBZ2UgKHllYXJzKQotIEZlbWFsZSBzZXggKE4sICUpCi0gSHlwZXJ0ZW5zaW9uIChOLCAlKQotIFNCUCAobW1IZykKLSBEQlAgKG1tSGcpCi0gRGlhYmV0ZXMgbWVsbGl0dXMgKE4sICUpCi0gVG90YWwgY2hvbGVzdGVyb2wgbGV2ZWxzIChtZy9kTCkKLSBMREwgY2hvbGVzdGVyb2wgbGV2ZWxzIChtZy9kTCkKLSBIREwgY2hvbGVzdGVyb2wgbGV2ZWxzIChtZy9kTCkKLSBUcmlnbHljZXJpZGUgbGV2ZWxzIChtZy9kTCkKLSBVc2Ugb2Ygc3RhdGlucyAoTiwgJSkKLSBVc2Ugb2YgYW50aXBsYXRlbGV0IGRydWdzIChOLCAlKQotIEJNSSAoa2cvbcKyKQotIFNtb2tpbmcgc3RhdHVzIChOLCAlKQogIC0gTmV2ZXIgc21va2VycwogIC0gRXgtc21va2VycwogIC0gQ3VycmVudCBzbW9rZXJzCi0gSGlzdG9yeSBvZiBDQUQgKE4sICUpCi0gSGlzdG9yeSBvZiBQQUQgKE4sICUpCi0gQ2xpbmljYWwgbWFuaWZlc3RhdGlvbnMKICAtIEFzeW1wdG9tYXRpYwogIC0gQW1hdXJvc2lzIGZ1Z2F4CiAgLSBUSUEKICAtIFN0cm9rZQotIGVHRlIgKG1ML21pbi8xLjczIG3CsikKLSBzdGVub3NpcwotIHllYXIgb2Ygc3VyZ2VyeQotIHBsYXF1ZSBjaGFyYWN0ZXJpc3RpY3MKLSBQQ1NLOQoKIyMjIEZpeCB0aGluZ3MgZm9yIGByIFRSQUlUX09GX0lOVEVSRVNUYAoKRm9yIHRoaXMgcHJvamVjdCB3ZSBhbHNvIGZpeCB0aGUgYHIgVFJBSVRfT0ZfSU5URVJFU1RgIGxldmVscyBmb3IgYW5hbHlzZXMuIAoKPiBNZWFzdXJlbWVudDoKPiBUaGlzIHdhcyBtZWFzdXJlZCBpbiBjaXRyYXRlIHBsYXNtYSwgYXQgcGcvbUwgdXNpbmcgYSBMVU1JTkVYIGFzc2F5LgoKYGBge3IgRml4SG9ybW9uZXN9CgojIEZpeCBob3Jtb25lcwphdHRhY2goQUVEQikKQUVEQlssIlBsYXNtYV9QQ1NLOSJdIDwtIE5BCkFFREIkUGxhc21hX1BDU0s5IDwtIGFzLm51bWVyaWMoQUVEQiRQQ1NLOV9wbGFzbWEpCkFFREIkUGxhc21hX1BDU0s5W1BDU0s5X3BsYXNtYSA9PSAtOTk5XSA8LSBOQQpBRURCJFBsYXNtYV9QQ1NLOVtQQ1NLOV9wbGFzbWEgPT0gLTg4OF0gPC0gTkEKQUVEQiRQbGFzbWFfUENTSzlbUENTSzlfcGxhc21hID09IC03NzddIDwtIE5BCkFFREIkUGxhc21hX1BDU0s5W1BDU0s5X3BsYXNtYSA9PSAtNjY2XSA8LSBOQQoKZGV0YWNoKEFFREIpCgpBRURCJFBsYXNtYV9QQ1NLOV9yYW5rTm9ybSA8LSBxbm9ybSgocmFuayhBRURCJFBDU0s5X3BsYXNtYSwgbmEubGFzdCA9ICJrZWVwIikgLSAwLjUpIC8gc3VtKCFpcy5uYShBRURCJFBDU0s5X3BsYXNtYSkpKQoKQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJQQ1NLOV9wbGFzbWEiLCAiUGxhc21hX1BDU0s5IiwgIlBsYXNtYV9QQ1NLOV9yYW5rTm9ybSIpKQpyZXF1aXJlKGxhYmVsbGVkKQpBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQpBRURCLnRlbXAkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRIb3NwaXRhbCkKQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCgpEVDo6ZGF0YXRhYmxlKEFFREIudGVtcFsxOjEwLF0sIGNhcHRpb24gPSAiRXhjZXJwdCBvZiB0aGUgd2hvbGUgQUVEQi4iLCByb3duYW1lcyA9IEZBTFNFKQoKcm0oQUVEQi50ZW1wKQoKCmBgYAoKCmBgYHtyIElSTlQgSG9ybW9uZXM6IFZpc3VhbGlzYXRpb259CmxpYnJhcnkobGFiZWxsZWQpCkFFREIkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCJEdlbmRlcikKQUVEQiRQQ1NLOV9wbGFzbWEgPC0gYXMubnVtZXJpYyhBRURCJFBDU0s5X3BsYXNtYSkKCmdncHVicjo6Z2doaXN0b2dyYW0oQUVEQiwgIlBsYXNtYV9QQ1NLOSIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsCiAgICAgICAgICAgICAgICAgICAgI2FkZF9kZW5zaXR5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICNhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJQQ1NLOSAoY2l0cmF0ZS1wbGFzbWEpIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gInBnL21MIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCmdncHVicjo6Z2doaXN0b2dyYW0oQUVEQiwgIlBsYXNtYV9QQ1NLOV9yYW5rTm9ybSIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiUENTSzkgKGNpdHJhdGUtcGxhc21hKSIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJwZy9tTFxuaW52ZXJzZS1yYW5rIG5vcm1hbGl6ZWQiLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKYGBgCgoKYGBge3IgQmFzZWxpbmUgQUVEQjogcHJlcGFyYXRpb259CmNhdCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKY2F0KCJTRUxFQ1RJT04gVEhFIFNISVpaTEVcbiIpCgojIyMgQXJ0ZXJ5IGxldmVscwojIEFFZGF0YSRBcnRlcnlfc3VtbWFyeTogCiMgICAgICAgICAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbAojIE5PVCBVU0UgLSAwIE5vIGFydGVyeSBrbm93biAoeWV0KSwgbm8gc3VyZ2VyeSAocGF0aWVudCBpbGwsIGRpZWQsIGV4aXRlZCBzdHVkeSksIHJlLW51bWJlcmVkIHRvIEFBQQojIFVTRSAtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJvdGlkIChsZWZ0ICYgcmlnaHQpCiMgVVNFIC0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVtb3JhbC9pbGlhYyAobGVmdCwgcmlnaHQgb3IgYm90aCBzaWRlcykKIyBOT1QgVVNFIC0gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgY2Fyb3RpZCBhcnRlcmllcyAoY29tbW9uLCBleHRlcm5hbCkKIyBOT1QgVVNFIC0gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fyb3RpZCBieXBhc3MgYW5kIGluanVyeSAobGVmdCwgcmlnaHQgb3IgYm90aCBzaWRlcykKIyBOT1QgVVNFIC0gNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZXVyeXNtYXRhIChjYXJvdGlkICYgZmVtb3JhbCkKIyBOT1QgVVNFIC0gNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW9ydGEKIyBOT1QgVVNFIC0gNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgYXJ0ZXJpZXMgKHJlbmFsLCBwb3BsaXRlYWwsIHZlcnRlYnJhbCkKIyBOT1QgVVNFIC0gOCAgICAgICAgICAgICAgICAgICAgICAgIGZlbW9yYWwgYnlwYXNzLCBhbmdpb3NlYWwgYW5kIGluanVyeSAobGVmdCwgcmlnaHQgb3IgYm90aCBzaWRlcykKCiMjIyBBRWRhdGEkaW5mb3JtZWRjb25zZW50CiMgICAgICAgICAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsCiMgTk9UIFVTRSAtIC05OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcKIyBOT1QgVVNFIC0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgZGllZAojIFVTRSAtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMKIyBVU0UgLSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlCiMgVVNFIC0gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gaGVhbHRoIHRyZWF0bWVudAojIFVTRSAtIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBOT1QgVVNFIC0gNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZSwgbm8gY29tbWVyaWNhbCBidXNpbmVzcwojIE5PVCBVU0UgLSA2ICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIFVTRSAtIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUKIyBOT1QgVVNFIC0gOSAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyaWNhbCBidXNpbmVzcwojIFVTRSAtIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgTk9UIFVTRSAtIDExIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQKIyBOT1QgVVNFIC0gMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIGhlYWx0aCB0cmVhdG1lbnQKIyBOT1QgVVNFIC0gMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMKIyBOT1QgVVNFIC0gMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUKIyBOT1QgVVNFIC0gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUKIyBVU0UgLSAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gY29tbWVyaWNhbCBidXNpbmVzcwojIFVTRSAtIDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcwojIE5PVCBVU0UgLSAyMSAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbwojIE5PVCBVU0UgLSAyMiAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIFVTRSAtIDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gbWVkaWNhbCBpbmZvCiMgVVNFIC0gMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbwojIFVTRSAtIDI2ICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsICBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8KIyBOT1QgVVNFIC0gMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCBkb2Vzbid0IHdhbnQgdG8KIyBOT1QgVVNFIC0gMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgdW5hYmxlIHRvIHNpZ24KIyBOT1QgVVNFIC0gMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgbm8gcmVhY3Rpb24KIyBOT1QgVVNFIC0gMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8sIGxvc3QKIyBOT1QgVVNFIC0gMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8sIHRvbyBvbGQKIyBOT1QgVVNFIC0gMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gbWVkaWNhbCBpbmZvLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUKIyBOT1QgVVNFIC0gMzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyAobmV2ZXIgYXNrZWQgZm9yIElDIGJlY2F1c2UgdGhlcmUgd2FzIG5vIHRpc3N1ZSkKIyBVU0UgLSAzNiAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSAzNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCBlbmRwb2ludAojIFVTRSAtIDM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsIG5pZXRzIGludnVsbGVuLCB3ZWwgYWxsZXMgZ2VicnVpa2VuCiMgVVNFIC0gMzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kIGluZm9ybWVkIGNvbmNlbnRzOiB5ZXMsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBOT1QgVVNFIC0gNDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub29pdCBnZWluY2x1ZGVlcmQKCmNhdCgiLSBzYW5pdHkgY2hlY2tpbmcgUFJJT1IgdG8gc2VsZWN0aW9uIikKbGlicmFyeShkYXRhLnRhYmxlKQpyZXF1aXJlKGxhYmVsbGVkKQphZS5nZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIkR2VuZGVyKQphZS5ob3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQiRIb3NwaXRhbCkKdGFibGUoYWUuZ2VuZGVyLCBhZS5ob3NwaXRhbCwgZG5uID0gYygiU2V4IiwgIkhvc3BpdGFsIikpCmFlLmFydGVyeSA8LSB0b19mYWN0b3IoQUVEQiRBcnRlcnlfc3VtbWFyeSkKdGFibGUoYWUuYXJ0ZXJ5LCBhZS5nZW5kZXIsIGRubiA9IGMoIlNleCIsICJBcnRlcnkiKSkKCnJtKGFlLmdlbmRlciwgYWUuaG9zcGl0YWwsIGFlLmFydGVyeSkKCiMgSSBjaGFuZ2UgbnVtZXJpYyBhbmQgZmFjdG9ycyBtYW51YWxseSBiZWNhdXNlLCB3ZWxsLCBJIHdvdWxkbid0IGtub3cgaG93IHRvIGZpeCBpdCBvdGhlcndpc2UKIyB0byBoYXZlIHRoaXMgJ3RpYmJsZScgd29yayB3aXRoICd0YWJsZW9uZScuLi4gOi0pCgpBRURCJEFnZSA8LSBhcy5udW1lcmljKEFFREIkQWdlKQpBRURCJGRpYXN0b2xpIDwtIGFzLm51bWVyaWMoQUVEQiRkaWFzdG9saSkKQUVEQiRzeXN0b2xpYyA8LSBhcy5udW1lcmljKEFFREIkc3lzdG9saWMpCgpBRURCJFRDX2ZpbmFsQ1UgPC0gYXMubnVtZXJpYyhBRURCJFRDX2ZpbmFsQ1UpCkFFREIkTERMX2ZpbmFsQ1UgPC0gYXMubnVtZXJpYyhBRURCJExETF9maW5hbENVKQpBRURCJEhETF9maW5hbENVIDwtIGFzLm51bWVyaWMoQUVEQiRIRExfZmluYWxDVSkKQUVEQiRUR19maW5hbENVIDwtIGFzLm51bWVyaWMoQUVEQiRUR19maW5hbENVKQoKQUVEQiRUQ19maW5hbCA8LSBhcy5udW1lcmljKEFFREIkVENfZmluYWwpCkFFREIkTERMX2ZpbmFsIDwtIGFzLm51bWVyaWMoQUVEQiRMRExfZmluYWwpCkFFREIkSERMX2ZpbmFsIDwtIGFzLm51bWVyaWMoQUVEQiRIRExfZmluYWwpCkFFREIkVEdfZmluYWwgPC0gYXMubnVtZXJpYyhBRURCJFRHX2ZpbmFsKQoKQUVEQiRBZ2UgPC0gYXMubnVtZXJpYyhBRURCJEFnZSkKQUVEQiRHRlJfTURSRCA8LSBhcy5udW1lcmljKEFFREIkR0ZSX01EUkQpCkFFREIkQk1JIDwtIGFzLm51bWVyaWMoQUVEQiRCTUkpCkFFREIkZUNpZ2FyZXR0ZXMgPC0gYXMubnVtZXJpYyhBRURCJGVDaWdhcmV0dGVzKQpBRURCJGVQYWNrWWVhcnNTbW9raW5nIDwtIGFzLm51bWVyaWMoQUVEQiRlUGFja1llYXJzU21va2luZykKQUVEQiRFUF9jb21wb3NpdGVfdGltZSA8LSBhcy5udW1lcmljKEFFREIkRVBfY29tcG9zaXRlX3RpbWUpCkFFREIkRVBfbWFqb3JfdGltZSA8LSBhcy5udW1lcmljKEFFREIkRVBfbWFqb3JfdGltZSkKCnJlcXVpcmUobGFiZWxsZWQpCkFFREIkT1J5ZWFyIDwtIHRvX2ZhY3RvcihBRURCJE9SeWVhcikKQUVEQiRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIkR2VuZGVyKQpBRURCJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCJEhvc3BpdGFsKQpBRURCJEtET1FJIDwtIHRvX2ZhY3RvcihBRURCJEtET1FJKQpBRURCJEJNSV9XSE8gPC0gdG9fZmFjdG9yKEFFREIkQk1JX1dITykKQUVEQiREaWFiZXRlc1N0YXR1cyA8LSB0b19mYWN0b3IoQUVEQiREaWFiZXRlc1N0YXR1cykKQUVEQiRTbW9rZXJTdGF0dXMgPC0gdG9fZmFjdG9yKEFFREIkU21va2VyU3RhdHVzKQpBRURCJEFsY29ob2xVc2UgPC0gdG9fZmFjdG9yKEFFREIkQWxjb2hvbFVzZSkKCkFFREIkSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQgPC0gdG9fZmFjdG9yKEFFREIkSHlwZXJ0ZW5zaW9uMSkKQUVEQiRIeXBlcnRlbnNpb24uc2VsZnJlcG9ydGRydWcgPC0gdG9fZmFjdG9yKEFFREIkSHlwZXJ0ZW5zaW9uMikKQUVEQiRIeXBlcnRlbnNpb24uY29tcG9zaXRlIDwtIHRvX2ZhY3RvcihBRURCJEh5cGVydGVuc2lvbi5jb21wb3NpdGUpCkFFREIkSHlwZXJ0ZW5zaW9uLmRydWdzIDwtIHRvX2ZhY3RvcihBRURCJEh5cGVydGVuc2lvbi5kcnVncykKCkFFREIkTWVkLmFudGljb2FndWxhbnRzIDwtIHRvX2ZhY3RvcihBRURCJE1lZC5hbnRpY29hZ3VsYW50cykKQUVEQiRNZWQuYWxsLmFudGlwbGF0ZWxldCA8LSB0b19mYWN0b3IoQUVEQiRNZWQuYWxsLmFudGlwbGF0ZWxldCkKQUVEQiRNZWQuU3RhdGluLkxMRCA8LSB0b19mYWN0b3IoQUVEQiRNZWQuU3RhdGluLkxMRCkKCkFFREIkU3Ryb2tlX0R4IDwtIHRvX2ZhY3RvcihBRURCJFN0cm9rZV9EeCkKQUVEQiRDQURfaGlzdG9yeSA8LSB0b19mYWN0b3IoQUVEQiRDQURfaGlzdG9yeSkKQUVEQiRQQU9EIDwtIHRvX2ZhY3RvcihBRURCJFBBT0QpCkFFREIkUGVyaXBoZXJhbC5pbnRlcnYgPC0gdG9fZmFjdG9yKEFFREIkUGVyaXBoZXJhbC5pbnRlcnYpCgpBRURCJHN5bXB0IDwtIHRvX2ZhY3RvcihBRURCJHN5bXB0KQpBRURCJFN5bXB0b21zLjNnIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjNnKQpBRURCJFN5bXB0b21zLjRnIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjRnKQpBRURCJFN5bXB0b21zLjVHIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjVHKQpBRURCJEFzeW1wdFN5bXB0IDwtIHRvX2ZhY3RvcihBRURCJEFzeW1wdFN5bXB0KQpBRURCJEFzeW1wdFN5bXB0MkcgPC0gdG9fZmFjdG9yKEFFREIkQXN5bXB0U3ltcHQyRykKCkFFREIkcmVzdGVub3MgPC0gdG9fZmFjdG9yKEFFREIkcmVzdGVub3MpCkFFREIkc3Rlbm9zZSA8LSB0b19mYWN0b3IoQUVEQiRzdGVub3NlKQpBRURCJEVQX2NvbXBvc2l0ZSA8LSB0b19mYWN0b3IoQUVEQiRFUF9jb21wb3NpdGUpCkFFREIkRVBfbWFqb3IgPC0gdG9fZmFjdG9yKEFFREIkRVBfbWFqb3IpCkFFREIkTWFjcm9waGFnZXMuYmluIDwtIHRvX2ZhY3RvcihBRURCJE1hY3JvcGhhZ2VzLmJpbikKQUVEQiRTTUMuYmluIDwtIHRvX2ZhY3RvcihBRURCJFNNQy5iaW4pCkFFREIkSVBILmJpbiA8LSB0b19mYWN0b3IoQUVEQiRJUEguYmluKQpBRURCJENhbGMuYmluIDwtIHRvX2ZhY3RvcihBRURCJENhbGMuYmluKQpBRURCJENvbGxhZ2VuLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRDb2xsYWdlbi5iaW4pCkFFREIkRmF0LmJpbl8xMCA8LSB0b19mYWN0b3IoQUVEQiRGYXQuYmluXzEwKQpBRURCJEZhdC5iaW5fNDAgPC0gdG9fZmFjdG9yKEFFREIkRmF0LmJpbl80MCkKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlIDwtIHRvX2ZhY3RvcihBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGUpCkFFREIkUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXggPC0gdG9fZmFjdG9yKEFFREIkUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgpCgpBRURCJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCJEFydGVyeV9zdW1tYXJ5KQoKQUVEQiRpbmZvcm1lZGNvbnNlbnQgPC0gdG9fZmFjdG9yKEFFREIkaW5mb3JtZWRjb25zZW50KQoKQUVEQi5DRUEgPC0gc3Vic2V0KEFFREIsCiAgICAgICAgICAgICAgICAgICAgKEFydGVyeV9zdW1tYXJ5ID09ICJjYXJvdGlkIChsZWZ0ICYgcmlnaHQpIiB8IEFydGVyeV9zdW1tYXJ5ID09ICJvdGhlciBjYXJvdGlkIGFydGVyaWVzIChjb21tb24sIGV4dGVybmFsKSIpICYgIyB3ZSBvbmx5IHdhbnQgY2Fyb3RpZHMKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm1pc3NpbmciICYgIyB3ZSBhcmUgcmVhbGx5IHN0cmljdCBpbiBzZWxlY3RpbmcgYmFzZWQgb24gJ2luZm9ybWVkIGNvbnNlbnQnIQogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGRpZWQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIGhlYWx0aCB0cmVhdG1lbnQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkb2Vzbid0IHdhbnQgdG8iICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCB1bmFibGUgdG8gc2lnbiIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIG5vIHJlYWN0aW9uIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgbG9zdCIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIHRvbyBvbGQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gbWVkaWNhbCBpbmZvLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGVuZHBvaW50IiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJub29pdCBnZWluY2x1ZGVlcmQiICYgCiAgICAgICAgICAgICAgICAgICAgICFpcy5uYShBc3ltcHRTeW1wdDJHKSkKIyBBRURCLkNFQVsxOjEwLCAxOjEwXQpkaW0oQUVEQi5DRUEpCgpBRURCLmZ1bGwgPC0gc3Vic2V0KEFFREIsCiAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJtaXNzaW5nIiAmICMgd2UgYXJlIHJlYWxseSBzdHJpY3QgaW4gc2VsZWN0aW5nIGJhc2VkIG9uICdpbmZvcm1lZCBjb25zZW50JyEKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkaWVkIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gY29tbWVyaWNhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyaWNhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBoZWFsdGggdHJlYXRtZW50IiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgZG9lc24ndCB3YW50IHRvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgdW5hYmxlIHRvIHNpZ24iICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBubyByZWFjdGlvbiIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGxvc3QiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCB0b28gb2xkIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIG1lZGljYWwgaW5mbywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubyAobmV2ZXIgYXNrZWQgZm9yIElDIGJlY2F1c2UgdGhlcmUgd2FzIG5vIHRpc3N1ZSkiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBlbmRwb2ludCIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm9vaXQgZ2VpbmNsdWRlZXJkIikKIyBBRURCLkNFQVsxOjEwLCAxOjEwXQpkaW0oQUVEQi5mdWxsKQoKYGBgCgoKYGBge3IgQmFzZWxpbmUgQUVEQjogY3JlYXRpb259CmNhdCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKY2F0KCJDUkVBVEUgQkFTRUxJTkUgVEFCTEVcbiIpCgojIEJhc2VsaW5lIHRhYmxlIHZhcmlhYmxlcwpiYXNldGFibGVfdmFycyA9IGMoIkhvc3BpdGFsIiwgIk9SeWVhciIsCiAgICAgICAgICAgICAgICAgICAiQWdlIiwgIkdlbmRlciIsIAogICAgICAgICAgICAgICAgICAgIyAiVENfZmluYWxDVSIsICJMRExfZmluYWxDVSIsICJIRExfZmluYWxDVSIsICJUR19maW5hbENVIiwgCiAgICAgICAgICAgICAgICAgICAiVENfZmluYWwiLCAiTERMX2ZpbmFsIiwgIkhETF9maW5hbCIsICJUR19maW5hbCIsIAogICAgICAgICAgICAgICAgICAgIyAiaHNDUlBfcGxhc21hIiwKICAgICAgICAgICAgICAgICAgICJzeXN0b2xpYyIsICJkaWFzdG9saSIsICJHRlJfTURSRCIsICJCTUkiLCAKICAgICAgICAgICAgICAgICAgICJLRE9RSSIsICJCTUlfV0hPIiwKICAgICAgICAgICAgICAgICAgICJTbW9rZXJTdGF0dXMiLCAiQWxjb2hvbFVzZSIsCiAgICAgICAgICAgICAgICAgICAiRGlhYmV0ZXNTdGF0dXMiLCAKICAgICAgICAgICAgICAgICAgICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCIsICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydGRydWciLCAiSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSIsICJIeXBlcnRlbnNpb24uZHJ1Z3MiLCAKICAgICAgICAgICAgICAgICAgICJNZWQuYW50aWNvYWd1bGFudHMiLCAiTWVkLmFsbC5hbnRpcGxhdGVsZXQiLCAiTWVkLlN0YXRpbi5MTEQiLCAKICAgICAgICAgICAgICAgICAgICJTdHJva2VfRHgiLCAic3ltcHQiLCAiU3ltcHRvbXMuNUciLCAiQXN5bXB0U3ltcHQiLCAiQXN5bXB0U3ltcHQyRyIsCiAgICAgICAgICAgICAgICAgICAicmVzdGVub3MiLCAic3Rlbm9zZSIsCiAgICAgICAgICAgICAgICAgICAiQ0FEX2hpc3RvcnkiLCAiUEFPRCIsICJQZXJpcGhlcmFsLmludGVydiIsIAogICAgICAgICAgICAgICAgICAgIkVQX2NvbXBvc2l0ZSIsICJFUF9jb21wb3NpdGVfdGltZSIsICJFUF9tYWpvciIsICJFUF9tYWpvcl90aW1lIiwKICAgICAgICAgICAgICAgICAgICJNQUNfcmFua05vcm0iLCAiU01DX3JhbmtOb3JtIiwgIk1hY3JvcGhhZ2VzLmJpbiIsICJTTUMuYmluIiwKICAgICAgICAgICAgICAgICAgICJOZXV0cm9waGlsc19yYW5rTm9ybSIsICJNYXN0Q2VsbHNfcmFua05vcm0iLAogICAgICAgICAgICAgICAgICAgIklQSC5iaW4iLCAiVmVzc2VsRGVuc2l0eV9yYW5rTm9ybSIsCiAgICAgICAgICAgICAgICAgICAiQ2FsYy5iaW4iLCAiQ29sbGFnZW4uYmluIiwgCiAgICAgICAgICAgICAgICAgICAiRmF0LmJpbl8xMCIsICJGYXQuYmluXzQwIiwgIk92ZXJhbGxQbGFxdWVQaGVub3R5cGUiLCAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICAgIlBsYXNtYV9QQ1NLOSIsICJQbGFzbWFfUENTSzlfcmFua05vcm0iKQoKYmFzZXRhYmxlX2JpbiA9IGMoIkdlbmRlciIsIAogICAgICAgICAgICAgICAgICAiS0RPUUkiLCAiQk1JX1dITyIsCiAgICAgICAgICAgICAgICAgICJTbW9rZXJTdGF0dXMiLCAiQWxjb2hvbFVzZSIsCiAgICAgICAgICAgICAgICAgICJEaWFiZXRlc1N0YXR1cyIsIAogICAgICAgICAgICAgICAgICAiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQiLCAiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnRkcnVnIiwgIkh5cGVydGVuc2lvbi5jb21wb3NpdGUiLCAiSHlwZXJ0ZW5zaW9uLmRydWdzIiwgCiAgICAgICAgICAgICAgICAgICJNZWQuYW50aWNvYWd1bGFudHMiLCAiTWVkLmFsbC5hbnRpcGxhdGVsZXQiLCAiTWVkLlN0YXRpbi5MTEQiLCAKICAgICAgICAgICAgICAgICAgIlN0cm9rZV9EeCIsICJzeW1wdCIsICJTeW1wdG9tcy41RyIsICJBc3ltcHRTeW1wdCIsICJBc3ltcHRTeW1wdDJHIiwKICAgICAgICAgICAgICAgICAgInJlc3Rlbm9zIiwgInN0ZW5vc2UiLAogICAgICAgICAgICAgICAgICAiQ0FEX2hpc3RvcnkiLCAiUEFPRCIsICJQZXJpcGhlcmFsLmludGVydiIsIAogICAgICAgICAgICAgICAgICAiRVBfY29tcG9zaXRlIiwgIk1hY3JvcGhhZ2VzLmJpbiIsICJTTUMuYmluIiwKICAgICAgICAgICAgICAgICAgIklQSC5iaW4iLCAKICAgICAgICAgICAgICAgICAgIkNhbGMuYmluIiwgIkNvbGxhZ2VuLmJpbiIsIAogICAgICAgICAgICAgICAgICAiRmF0LmJpbl8xMCIsICJGYXQuYmluXzQwIiwgIk92ZXJhbGxQbGFxdWVQaGVub3R5cGUiLCAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiKQojIGJhc2V0YWJsZV9iaW4KCmJhc2V0YWJsZV9jb24gPSBiYXNldGFibGVfdmFyc1shYmFzZXRhYmxlX3ZhcnMgJWluJSBiYXNldGFibGVfYmluXQojIGJhc2V0YWJsZV9jb24KYGBgCgojIyMgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBTdHVkeTogYmFzZWxpbmUgY2hhcmFjdGVyaXN0aWNzClNob3dpbmcgdGhlIGJhc2VsaW5lIHRhYmxlIG9mIHRoZSB3aG9sZSBBdGhlcm8tRXhwcmVzcyBCaW9iYW5rLgoKYGBge3IgQmFzZWxpbmUgQUVEQjogVmlzdWFsaXplIEFFREJ9CiMgQ3JlYXRlIGJhc2VsaW5lIHRhYmxlcwojIGh0dHA6Ly9yc3R1ZGlvLXB1YnMtc3RhdGljLnMzLmFtYXpvbmF3cy5jb20vMTMzMjFfZGEzMTQ2MzNkYjkyNGRjNzg5ODZhODUwODEzYTUwZDUuaHRtbApBRURCLnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZhY3RvclZhcnMgPSBiYXNldGFibGVfYmluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RyYXRhID0gIlN5bXB0b21zLjRnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gQUVEQi5mdWxsLCBpbmNsdWRlTkEgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubm9ybWFsID0gYygpLCBtaXNzaW5nID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZSA9IEZBTFNFLCBub1NwYWNlcyA9IEZBTFNFLCBzaG93QWxsTGV2ZWxzID0gVFJVRSwgZXhwbGFpbiA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJwZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnREaWdpdHMgPSAzKVssMTozXQpgYGAKCgpgYGB7ciBCYXNlbGluZSBBRURCOiBWaXN1YWxpemUgQUVEQiBDRUF9CiMgQ3JlYXRlIGJhc2VsaW5lIHRhYmxlcwojIGh0dHA6Ly9yc3R1ZGlvLXB1YnMtc3RhdGljLnMzLmFtYXpvbmF3cy5jb20vMTMzMjFfZGEzMTQ2MzNkYjkyNGRjNzg5ODZhODUwODEzYTUwZDUuaHRtbApBRURCLkNFQS50YWJsZU9uZSA9IHByaW50KENyZWF0ZVRhYmxlT25lKHZhcnMgPSBiYXNldGFibGVfdmFycywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmYWN0b3JWYXJzID0gYmFzZXRhYmxlX2JpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0cmF0YSA9ICJTeW1wdG9tcy40ZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEFFREIuQ0VBLCBpbmNsdWRlTkEgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubm9ybWFsID0gYygpLCBtaXNzaW5nID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZSA9IEZBTFNFLCBub1NwYWNlcyA9IEZBTFNFLCBzaG93QWxsTGV2ZWxzID0gVFJVRSwgZXhwbGFpbiA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJwZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnREaWdpdHMgPSAzKVssMTozXQpgYGAKCgoKIyMgQXRoZXJvLUV4cHJlc3MgR2Vub21pY3MgU3R1ZHk6IHByZXBhcmUKCkxldCdzIGNvbWJpbmUgdGhlIGZ1bGwgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBTdHVkeSB3aXRoIHRoZSBrZXktdGFibGUgY29udGFpbmluZyB0aGUgQUVHUyBkYXRhLgoKPiBOT1RFOiB0aGlzIHNob3VsZCBzdW0gdG8gMiwxMjQgc2FtcGxlcyB3aXRoIGdlbm90eXBlcy4KCmBgYHtyIGNyZWF0ZSBBRUdTfQpBRUdTIDwtIG1lcmdlKEFFREIuZnVsbCwgQUVHUzEyMy5zYW1wbGVMaXN0LmtleXRhYmxlLCBieS54ID0gIlNUVURZX05VTUJFUiIsIGJ5LnkgPSAiU1RVRFlfTlVNQkVSIiwgc29ydCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICBhbGwgPSBUUlVFKQoKZGltKEFFR1MpCgpBRUdTJFVQSUQueSA8LSBOVUxMCm5hbWVzKEFFR1MpW25hbWVzKEFFR1MpID09ICJVUElELngiXSA8LSAiVVBJRCIKQUVHUyRBZ2UueSA8LSBOVUxMCm5hbWVzKEFFR1MpW25hbWVzKEFFR1MpID09ICJBZ2UueCJdIDwtICJBZ2UiCgp0YWJsZShBRUdTJENISVAsIHVzZU5BID0gImlmYW55IikKCkFFR1MkR1dBUyA8LSBBRUdTJENISVAKQUVHUyRHV0FTW2lzLm5hKEFFR1MkR1dBUyldIDwtICJub3QgZ2Vub3R5cGVkIgpBRUdTJEdXQVNbQUVHUyRHV0FTICE9ICJub3QgZ2Vub3R5cGVkIl0gPC0gImdlbm90eXBlZCIKCnRhYmxlKEFFR1MkQ0hJUCwgQUVHUyRHV0FTLCB1c2VOQSA9ICJpZmFueSIpCmBgYAoKQWxzbyBhIHZpc3VhbGlzYXRpb24gb2YgdGhlIEFFR1Mgd2l0aCBBRURCIG92ZXJsYXBzLgpgYGB7ciB2aXN1YWxpc2UgQUVHUyBvdmVybGFwc30KbGlicmFyeShVcFNldFIpCnJlcXVpcmUoZ2dwbG90MikKcmVxdWlyZShwbHlyKQpyZXF1aXJlKGdyaWRFeHRyYSkKcmVxdWlyZShncmlkKQoKQUVEQi5hdmFpbEdXQVMgPSBsaXN0KApBRUdTMSA9IHN1YnNldChBRUdTLCBDSElQID09ICJBZmZ5U05QNSIsIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIpKVssMV0sCkFFR1MyID0gc3Vic2V0KEFFR1MsIENISVAgPT0gIkFmZnlBeGlvbUNFVSIsIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIpKVssMV0sCkFFR1MzID0gc3Vic2V0KEFFR1MsIENISVAgPT0gIklsbEdTQSIsIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIpKVssMV0sCkFFREIgPSBBRUdTJFNUVURZX05VTUJFUikKCnAxIDwtIFVwU2V0Ujo6dXBzZXQoZnJvbUxpc3QoQUVEQi5hdmFpbEdXQVMpLCAKICAgICAgICAgICAgICAgICAgICBzZXRzID0gYygiQUVEQiIsICJBRUdTMSIsICJBRUdTMiIsICJBRUdTMyIpLCAKICAgICAgICAgICAgICAgICAgICBtYWluLmJhci5jb2xvciA9IGModWl0aG9mX2NvbG9yWzE1XSwgdWl0aG9mX2NvbG9yWzJdLCB1aXRob2ZfY29sb3JbM10sIHVpdGhvZl9jb2xvclsyMV0pLCAKICAgICAgICAgICAgICAgICAgICBtYWluYmFyLnkubGFiZWwJPSAiaW50ZXJzZWN0aW9uIHNhbXBsZSBzaXplIiwgCiAgICAgICAgICAgICAgICAgICAgc2V0cy5iYXIuY29sb3IgPSBjKHVpdGhvZl9jb2xvclsxNV0sIHVpdGhvZl9jb2xvclsyXSwgdWl0aG9mX2NvbG9yWzNdLCB1aXRob2ZfY29sb3JbMjFdKSwgCiAgICAgICAgICAgICAgICAgICAgc2V0cy54LmxhYmVsID0gInNhbXBsZSBzaXplIiwga2VlcC5vcmRlciA9IFRSVUUpCnBkZihwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIub3ZlcmxhcC5BRURCX0FFR1MxMjMuVXBTZXRSLnBkZiIpKQogIHAxCmRldi5vZmYoKQpwMQpybShwMSkKYGBgCgoKYGBge3IgU3BlY2lmaWNTZWxlY3Rpb259CnRhYmxlKEFFR1MkQXJ0ZXJ5X3N1bW1hcnksIEFFR1MkUUMyMDE4X0ZJTFRFUikKdGFibGUoQUVHUyRpbmZvcm1lZGNvbnNlbnQsIEFFR1MkUUMyMDE4X0ZJTFRFUikKQUVHU3NlbGVjdCA8LSBzdWJzZXQoQUVHUywgCiAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibWlzc2luZyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGRpZWQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIGhlYWx0aCB0cmVhdG1lbnQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkb2Vzbid0IHdhbnQgdG8iICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCB1bmFibGUgdG8gc2lnbiIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIG5vIHJlYWN0aW9uIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgbG9zdCIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIHRvbyBvbGQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gbWVkaWNhbCBpbmZvLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGVuZHBvaW50IiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJub29pdCBnZWluY2x1ZGVlcmQiKQoKQUVHU3NlbGVjdC5DRUEgPC0gc3Vic2V0KEFFR1MsICFpcy5uYShRQzIwMThfRklMVEVSKSAmIFFDMjAxOF9GSUxURVIgIT0gImlzc3VlIiAmIFFDMjAxOF9GSUxURVIgIT0gImZhbWlseV9kaXNjYXJkIiAmCiAgICAgICAgICAgICAgICAgICAgIChBcnRlcnlfc3VtbWFyeSA9PSAiY2Fyb3RpZCAobGVmdCAmIHJpZ2h0KSIgfCBBcnRlcnlfc3VtbWFyeSA9PSAib3RoZXIgY2Fyb3RpZCBhcnRlcmllcyAoY29tbW9uLCBleHRlcm5hbCkiKSAmICMgd2Ugb25seSB3YW50IGNhcm90aWRzCiAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibWlzc2luZyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGRpZWQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIGhlYWx0aCB0cmVhdG1lbnQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkb2Vzbid0IHdhbnQgdG8iICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCB1bmFibGUgdG8gc2lnbiIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIG5vIHJlYWN0aW9uIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgbG9zdCIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIHRvbyBvbGQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gbWVkaWNhbCBpbmZvLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGVuZHBvaW50IiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJub29pdCBnZWluY2x1ZGVlcmQiKQoKZGltKEFFR1NzZWxlY3QpCgp0YWJsZShBRUdTc2VsZWN0JEFydGVyeV9zdW1tYXJ5LCBBRUdTc2VsZWN0JFFDMjAxOF9GSUxURVIpCnRhYmxlKEFFR1NzZWxlY3QkQXJ0ZXJ5X3N1bW1hcnksIEFFR1NzZWxlY3QkQ0hJUCkKdGFibGUoQUVHU3NlbGVjdCRRQzIwMThfRklMVEVSLCBBRUdTc2VsZWN0JENISVApCnRhYmxlKEFFR1NzZWxlY3QkUUMyMDE4X0ZJTFRFUiwgQUVHU3NlbGVjdCRTQU1QTEVfVFlQRSkKCkFFREIudGVtcCA8LSBzdWJzZXQoQUVHU3NlbGVjdCwgIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJVUElEIiwgIkFnZSIsICJHZW5kZXIiLCAiSG9zcGl0YWwiLCAiQXJ0ZXJ5X3N1bW1hcnkiLCAiUUMyMDE4X0ZJTFRFUiIsICJDSElQIiwgIlNBTVBMRV9UWVBFIikpCnJlcXVpcmUobGFiZWxsZWQpCkFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCkFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQpBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSkKQUVEQi50ZW1wJFFDMjAxOF9GSUxURVIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRRQzIwMThfRklMVEVSKQpBRURCLnRlbXAkQ0hJUCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJENISVApCkFFREIudGVtcCRTQU1QTEVfVFlQRSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJFNBTVBMRV9UWVBFKQoKRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKCnJtKEFFREIudGVtcCkKCgpgYGAKCiMjIEF0aGVyby1FeHByZXNzIEdlbm9taWNzIFN0dWR5OiBiYXNlbGluZSBjaGFyYWN0ZXJpc3RpY3MKClNob3dpbmcgdGhlIGJhc2VsaW5lIHRhYmxlIG9mIHRoZSBBdGhlcm8tRXhwcmVzcyBHZW5vbWljcyBTdHVkeS4KCmBgYHtyIEJhc2VsaW5lIFNhbXBsZVNlbGVjdDogcHJlcGFyZX0KIyBDcmVhdGUgYmFzZWxpbmUgdGFibGVzCiMgaHR0cDovL3JzdHVkaW8tcHVicy1zdGF0aWMuczMuYW1hem9uYXdzLmNvbS8xMzMyMV9kYTMxNDYzM2RiOTI0ZGM3ODk4NmE4NTA4MTNhNTBkNS5odG1sCkFFR1NzZWxlY3QkR1dBUyA8LSB0b19mYWN0b3IoQUVHU3NlbGVjdCRHV0FTKQpBRUdTc2VsZWN0JENISVAgPC0gdG9fZmFjdG9yKEFFR1NzZWxlY3QkQ0hJUCkKQUVHU3NlbGVjdCRQQ0EgPC0gdG9fZmFjdG9yKEFFR1NzZWxlY3QkUENBKQpBRUdTc2VsZWN0JFNBTVBMRV9UWVBFIDwtIHRvX2ZhY3RvcihBRUdTc2VsZWN0JFNBTVBMRV9UWVBFKQpBRUdTc2VsZWN0JGluZm9ybWVkY29uc2VudCA8LSB0b19mYWN0b3IoQUVHU3NlbGVjdCRpbmZvcm1lZGNvbnNlbnQpCgpBRUdTc2VsZWN0LkNFQSRHV0FTIDwtIHRvX2ZhY3RvcihBRUdTc2VsZWN0LkNFQSRHV0FTKQpBRUdTc2VsZWN0LkNFQSRDSElQIDwtIHRvX2ZhY3RvcihBRUdTc2VsZWN0LkNFQSRDSElQKQpBRUdTc2VsZWN0LkNFQSRQQ0EgPC0gdG9fZmFjdG9yKEFFR1NzZWxlY3QuQ0VBJFBDQSkKQUVHU3NlbGVjdC5DRUEkU0FNUExFX1RZUEUgPC0gdG9fZmFjdG9yKEFFR1NzZWxlY3QuQ0VBJFNBTVBMRV9UWVBFKQpBRUdTc2VsZWN0LkNFQSRpbmZvcm1lZGNvbnNlbnQgPC0gdG9fZmFjdG9yKEFFR1NzZWxlY3QuQ0VBJGluZm9ybWVkY29uc2VudCkKCgpjYXQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpCmNhdCgiQ1JFQVRFIEJBU0VMSU5FIFRBQkxFXG4iKQoKIyBCYXNlbGluZSB0YWJsZSB2YXJpYWJsZXMKYmFzZXRhYmxlX3ZhcnMgPSBjKCJIb3NwaXRhbCIsIAogICAgICAgICAgICAgICAgICAgIkFnZSIsICJHZW5kZXIiLCAKICAgICAgICAgICAgICAgICAgICJUQ19maW5hbCIsICJMRExfZmluYWwiLCAiSERMX2ZpbmFsIiwgIlRHX2ZpbmFsIiwgCiAgICAgICAgICAgICAgICAgICAic3lzdG9saWMiLCAiZGlhc3RvbGkiLCAiR0ZSX01EUkQiLCAiQk1JIiwgCiAgICAgICAgICAgICAgICAgICAiS0RPUUkiLCAiQk1JX1dITyIsIAogICAgICAgICAgICAgICAgICAgIlNtb2tlckN1cnJlbnQiLCAiZUNpZ2FyZXR0ZXMiLCAiZVBhY2tZZWFyc1Ntb2tpbmciLAogICAgICAgICAgICAgICAgICAgIkRpYWJldGVzU3RhdHVzIiwgIkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0IiwgIkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0ZHJ1ZyIsICJIeXBlcnRlbnNpb24uY29tcG9zaXRlIiwgCiAgICAgICAgICAgICAgICAgICAiSHlwZXJ0ZW5zaW9uLmRydWdzIiwgIk1lZC5hbnRpY29hZ3VsYW50cyIsICJNZWQuYWxsLmFudGlwbGF0ZWxldCIsICJNZWQuU3RhdGluLkxMRCIsIAogICAgICAgICAgICAgICAgICAgIlN0cm9rZV9EeCIsICJzeW1wdCIsICJTeW1wdG9tcy41RyIsICJyZXN0ZW5vcyIsCiAgICAgICAgICAgICAgICAgICAiRVBfY29tcG9zaXRlIiwgIkVQX2NvbXBvc2l0ZV90aW1lIiwKICAgICAgICAgICAgICAgICAgICJtYWNtZWFuMCIsICJzbWNtZWFuMCIsICJNYWNyb3BoYWdlcy5iaW4iLCAiU01DLmJpbiIsICJuZXV0cm9waGlscyIsICJNYXN0X2NlbGxzX3BsYXF1ZSIsICJ2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCIsCiAgICAgICAgICAgICAgICAgICAiSVBILmJpbiIsIAogICAgICAgICAgICAgICAgICAgIkNhbGMuYmluIiwgIkNvbGxhZ2VuLmJpbiIsIAogICAgICAgICAgICAgICAgICAgIkZhdC5iaW5fMTAiLCAiRmF0LmJpbl80MCIsICJPdmVyYWxsUGxhcXVlUGhlbm90eXBlIiwgIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgICJTTUNfcmFua05vcm0iLCAiTUFDX3JhbmtOb3JtIiwgIk5ldXRyb3BoaWxzX3JhbmtOb3JtIiwgIk1hc3RDZWxsc19yYW5rTm9ybSIsICJWZXNzZWxEZW5zaXR5X3JhbmtOb3JtIiwKICAgICAgICAgICAgICAgICAgIkdXQVMiLCAiQ0hJUCIsICJQQ0EiLAogICAgICAgICAgICAgICAgICAiUGxhc21hX1BDU0s5IiwgIlBsYXNtYV9QQ1NLOV9yYW5rTm9ybSIpCgpiYXNldGFibGVfYmluID0gYygiR2VuZGVyIiwgCiAgICAgICAgICAgICAgICAgICJLRE9RSSIsICJCTUlfV0hPIiwgCiAgICAgICAgICAgICAgICAgICJTbW9rZXJDdXJyZW50IiwgCiAgICAgICAgICAgICAgICAgICJEaWFiZXRlc1N0YXR1cyIsICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCIsICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydGRydWciLCAiSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSIsIAogICAgICAgICAgICAgICAgICAiSHlwZXJ0ZW5zaW9uLmRydWdzIiwgIk1lZC5hbnRpY29hZ3VsYW50cyIsICJNZWQuYWxsLmFudGlwbGF0ZWxldCIsICJNZWQuU3RhdGluLkxMRCIsIAogICAgICAgICAgICAgICAgICAiU3Ryb2tlX0R4IiwgInN5bXB0IiwgIlN5bXB0b21zLjVHIiwgInJlc3Rlbm9zIiwKICAgICAgICAgICAgICAgICAgIkVQX2NvbXBvc2l0ZSIsICJNYWNyb3BoYWdlcy5iaW4iLCAiU01DLmJpbiIsCiAgICAgICAgICAgICAgICAgICJJUEguYmluIiwgCiAgICAgICAgICAgICAgICAgICJDYWxjLmJpbiIsICJDb2xsYWdlbi5iaW4iLCAKICAgICAgICAgICAgICAgICAgIkZhdC5iaW5fMTAiLCAiRmF0LmJpbl80MCIsICJPdmVyYWxsUGxhcXVlUGhlbm90eXBlIiwgIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgIkdXQVMiLCAiQ0hJUCIsICJQQ0EiKQoKYmFzZXRhYmxlX2JpbgoKYmFzZXRhYmxlX2NvbiA9IGJhc2V0YWJsZV92YXJzWyFiYXNldGFibGVfdmFycyAlaW4lIGJhc2V0YWJsZV9iaW5dCmJhc2V0YWJsZV9jb24KCmBgYAoKQWxsIEF0aGVyby1FeHByZXNzIEdlbm9taWNzIFN0dWR5IGRhdGEgKG4gPSAyLDAxMSksIGNvbXBhcmVkIHRvIHRoZSBfcmVtYWluaW5nXywgX3VuX2dlbm90eXBlZCBBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIFN0dWR5LgpgYGB7ciBCYXNlbGluZSBTYW1wbGVTZWxlY3Q6IFZpc3VhbGl6ZSwgd2hvbGV9CmNhdCgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKQpjYXQoIkRJU1BMQVkgQkFTRUxJTkUgVEFCTEVcbiIpCgpBRUdTc2VsZWN0LnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZhY3RvclZhcnMgPSBiYXNldGFibGVfYmluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0YSA9ICJHV0FTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gQUVHU3NlbGVjdCwgaW5jbHVkZU5BID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm5vcm1hbCA9IGMoKSwgbWlzc2luZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBGQUxTRSwgbm9TcGFjZXMgPSBGQUxTRSwgc2hvd0FsbExldmVscyA9IFRSVUUsIGV4cGxhaW4gPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAicGYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250RGlnaXRzID0gMylbLDE6Nl0KYGBgCgpCYXNlbGluZSBvZiB0aGUgdmFsaWQsIENFQSBhbmQgZ2Vub3R5cGVkIGRhdGEuCmBgYHtyIEJhc2VsaW5lIFNhbXBsZVNlbGVjdDogVmlzdWFsaXplLCBDRUF9CkFFR1NzZWxlY3QuQ0VBLnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZhY3RvclZhcnMgPSBiYXNldGFibGVfYmluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0YSA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBBRUdTc2VsZWN0LkNFQSwgaW5jbHVkZU5BID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm5vcm1hbCA9IGMoKSwgbWlzc2luZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBGQUxTRSwgbm9TcGFjZXMgPSBGQUxTRSwgc2hvd0FsbExldmVscyA9IFRSVUUsIGV4cGxhaW4gPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAicGYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250RGlnaXRzID0gMylbLDE6Nl0KYGBgCgojIyBBdGhlcm8tRXhwcmVzcyBHZW5vbWljcyBTdHVkeTogd3JpdGluZwoKTGV0J3Mgc2F2ZSB0aGUgYmFzZWxpbmUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBBdGhlcm8tRXhwcmVzcyBHZW5vbWljcyBTdHVkeS4KCmBgYHtyIEJhc2VsaW5lIFNhbXBsZVNlbGVjdGlvbjogd3JpdGV9CiMgV3JpdGUgYmFzZXRhYmxlCnJlcXVpcmUob3Blbnhsc3gpCgp3cml0ZS54bHN4KGZpbGUgPSBwYXN0ZTAoQkFTRUxJTkVfbG9jLCAiLyIsVG9kYXksIi4iLFBST0pFQ1ROQU1FLCIuQUVHUy5CYXNlbGluZVRhYmxlLnhsc3giKSwgCiAgICAgICAgICAgQUVHU3NlbGVjdC50YWJsZU9uZSwgCiAgICAgICAgICAgcm93Lm5hbWVzID0gVFJVRSwgCiAgICAgICAgICAgY29sLm5hbWVzID0gVFJVRSwgCiAgICAgICAgICAgc2hlZXROYW1lID0gIkFFR1NfQmFzZWxpbmUiKQoKd3JpdGUueGxzeChmaWxlID0gcGFzdGUwKEJBU0VMSU5FX2xvYywgIi8iLFRvZGF5LCIuIixQUk9KRUNUTkFNRSwiLkFFR1MuQ0VBLkJhc2VsaW5lVGFibGUueGxzeCIpLCAKICAgICAgICAgICBBRUdTc2VsZWN0LkNFQS50YWJsZU9uZSwgCiAgICAgICAgICAgcm93Lm5hbWVzID0gVFJVRSwgCiAgICAgICAgICAgY29sLm5hbWVzID0gVFJVRSwgCiAgICAgICAgICAgc2hlZXROYW1lID0gIkFFR1NfQmFzZWxpbmVfZnVsbCIpCmBgYAoKIyBTYW1wbGVMaXN0cwoKIyMgQXV0b3NvbWFsIGRhdGEuCgpXZSBhcmUgcmVhZHkgdG8gbWFrZSBhIHNhbXBsZUxpc3QgZm9yIHVzZSB3aXRoIHRoZSBpbXB1dGVkIGRhdGEuCgpgYGB7ciBTYXZlIFNhbXBsZVNlbGVjdH0KcmVxdWlyZShvcGVueGxzeCkKCnRlbXAgPC0gc3Vic2V0KEFFR1MsCiAgICAgICAgICAgICAgIEdXQVMgPT0gImdlbm90eXBlZCIsCiAgICAgICAgICAgICAgIHNlbGVjdCA9IGMoIklEXzEiLCAiSURfMiIsICJVUElEIiwgIlNUVURZX05VTUJFUiIsICMgSURfMiBpcyB0aGUgb3JkZXIgb2Ygc2FtcGxlcyEKICAgICAgICAgICAgICAgICAgICAgICAgICAiUUMyMDE4X0ZJTkFMIiwgIlFDMjAxOF9GSUxURVIiLCAiT3JpZ2luYWxPcmRlcl9wb3N0TWljaEltcF9RQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkFFR1NfdHlwZSIsICJDSElQIiwgIlNUVURZX1RZUEUiLCAiU0FNUExFX1RZUEUiLCAiUENBIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiUEMxIiwgIlBDMiIsICJQQzMiLCAiUEM0IiwgIlBDNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlBDNiIsICJQQzciLCAiUEM4IiwgIlBDOSIsICJQQzEwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V4IiwgIkFnZSIsICJPUnllYXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FsYy5iaW4iLCAiQ29sbGFnZW4uYmluIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhdC5iaW5fMTAiLCAiRmF0LmJpbl80MCIsICJJUEguYmluIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlNNQ19yYW5rTm9ybSIsICJNQUNfcmFua05vcm0iLCAiTmV1dHJvcGhpbHNfcmFua05vcm0iLCAiTWFzdENlbGxzX3JhbmtOb3JtIiwgIlZlc3NlbERlbnNpdHlfcmFua05vcm0iKSkgIyBTZWxlY3Qgc29tZSBwaGVub3R5cGUgb2YgaW50ZXJlc3QKZGltKHRlbXApCgojIEZpeCB0aGluZ3MKYXR0YWNoKHRlbXApCgp0ZW1wWywiQ2FsY2lmaWNhdGlvbiJdIDwtIE5BCnRlbXAkQ2FsY2lmaWNhdGlvbltDYWxjLmJpbiA9PSAibm8vbWlub3IiXSA8LSAiY29udHJvbCIKdGVtcCRDYWxjaWZpY2F0aW9uW0NhbGMuYmluID09ICJtb2RlcmF0ZS9oZWF2eSJdIDwtICJjYXNlIgoKdGVtcFssIkNvbGxhZ2VuIl0gPC0gTkEKdGVtcCRDb2xsYWdlbltDb2xsYWdlbi5iaW4gPT0gIm5vL21pbm9yIl0gPC0gImNvbnRyb2wiCnRlbXAkQ29sbGFnZW5bQ29sbGFnZW4uYmluID09ICJtb2RlcmF0ZS9oZWF2eSJdIDwtICJjYXNlIgoKdGVtcFssIkZhdDEwIl0gPC0gTkEKdGVtcCRGYXQxMFtGYXQuYmluXzEwID09ICI8MTAlIl0gPC0gImNvbnRyb2wiCnRlbXAkRmF0MTBbRmF0LmJpbl8xMCA9PSAiPjEwJSJdIDwtICJjYXNlIgoKdGVtcFssIkZhdDQwIl0gPC0gTkEKdGVtcCRGYXQ0MFtGYXQuYmluXzQwID09ICI8NDAlIl0gPC0gImNvbnRyb2wiCnRlbXAkRmF0NDBbRmF0LmJpbl80MCA9PSAiPjQwJSJdIDwtICJjYXNlIgoKdGVtcFssIklQSCJdIDwtIE5BCnRlbXAkSVBIW0lQSC5iaW4gPT0gIm5vIl0gPC0gImNvbnRyb2wiCnRlbXAkSVBIW0lQSC5iaW4gPT0gInllcyJdIDwtICJjYXNlIgoKZGV0YWNoKHRlbXApCgojIE1ha2luZyBzZWxlY3Rpb24gdmFyaWFibGUKYXR0YWNoKHRlbXApCnRlbXBbLCJTRUxFQ1RJT04iXSA8LSAibm90X3NlbGVjdGVkIgp0ZW1wJFNFTEVDVElPTlsoUUMyMDE4X0ZJTFRFUj09InBhc3NlZCIgfCBRQzIwMThfRklMVEVSPT0iZmFtaWx5X2tlZXAiKSAmIChTVFVEWV9UWVBFPT0iQ0VBIiAmIFBDQT09IkVVUiIpXSA8LSAic2VsZWN0ZWQiCmRldGFjaCh0ZW1wKQp0YWJsZSh0ZW1wJFNFTEVDVElPTiwgdGVtcCRRQzIwMThfRklMVEVSKQp0YWJsZSh0ZW1wJFNFTEVDVElPTiwgdGVtcCRTVFVEWV9UWVBFKQp0YWJsZSh0ZW1wJFNFTEVDVElPTiwgdGVtcCRQQ0EpCgpBRUdTMTIzX3NhbXBsZS5saXN0IDwtIHRlbXBbb3JkZXIodGVtcCRPcmlnaW5hbE9yZGVyX3Bvc3RNaWNoSW1wX1FDKSxdCgpBRUdTMTIzX3NhbXBsZS5saXN0JG1pc3NpbmcgPC0gMAoKc2FtcGxlX2ZpbGVfYWVncyA8LSBkcGx5cjo6c2VsZWN0KEFFR1MxMjNfc2FtcGxlLmxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF8xLCBJRF8yLCBtaXNzaW5nLCAjIElEXzIgaXMgdGhlIG9yZGVyIG9mIHNhbXBsZXMgLSB0aGF0IHdheSB3ZSBhbHdheXMga25vdyB3aGF0IHRoZSBvcmRlciBzaG91bGQgYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQSUQsIFNUVURZX05VTUJFUiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQzIwMThfRklOQUwsIFFDMjAxOF9GSUxURVIsIFNFTEVDVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFR1NfdHlwZSwgQ0hJUCwgU1RVRFlfVFlQRSwgU0FNUExFX1RZUEUsIFBDQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDMSwgUEMyLCBQQzMsIFBDNCwgUEM1LCBQQzYsIFBDNywgUEM4LCBQQzksIFBDMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXgsIEFnZSwgT1J5ZWFyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGNpZmljYXRpb24sIENvbGxhZ2VuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhdDEwLCBGYXQ0MCwgSVBILCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNQ19yYW5rTm9ybSwgTUFDX3JhbmtOb3JtLCBOZXV0cm9waGlsc19yYW5rTm9ybSwgTWFzdENlbGxzX3JhbmtOb3JtLCBWZXNzZWxEZW5zaXR5X3JhbmtOb3JtKSAgJT4lCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGFzLmNoYXJhY3RlcikgJT4lCiAgbXV0YXRlKFNBTVBMRV9UWVBFID0gZ3N1YignICcsICdfJywgU0FNUExFX1RZUEUpKSAlPiUKICBhZGRfcm93KC5iZWZvcmUgPSAxLCAKICAgICAgICAgIElEXzEgPSAiMCIsIElEXzIgPSAiMCIsIG1pc3NpbmcgPSAiMCIsIAogICAgICAgICAgVVBJRCA9ICJEIiwgU1RVRFlfTlVNQkVSID0gIkMiLAogICAgICAgICAgUUMyMDE4X0ZJTkFMID0gIkQiLCBRQzIwMThfRklMVEVSID0gIkQiLCBTRUxFQ1RJT04gPSAiRCIsCiAgICAgICAgICBBRUdTX3R5cGUgPSAiRCIsIENISVAgPSAiRCIsIFNUVURZX1RZUEUgPSAiRCIsIFNBTVBMRV9UWVBFID0gIkQiLCBQQ0EgPSAiRCIsCiAgICAgICAgICBQQzEgPSAiQyIsIFBDMiA9ICJDIiwgUEMzID0gIkMiLCBQQzQgPSAiQyIsIFBDNSA9ICJDIiwgUEM2ID0gIkMiLCBQQzcgPSAiQyIsIFBDOCA9ICJDIiwgUEM5ID0gIkMiLCBQQzEwID0gIkMiLAogICAgICAgICAgU2V4ID0gIkQiLCBBZ2UgPSAiQyIsIE9SeWVhciA9ICJDIiwgCiAgICAgICAgICBDYWxjaWZpY2F0aW9uID0gIkIiLCBDb2xsYWdlbiA9ICJCIiwgCiAgICAgICAgICBGYXQxMCA9ICJCIiwgRmF0NDAgPSAiQiIsIElQSCA9ICJCIiwgCiAgICAgICAgICBTTUNfcmFua05vcm0gPSAiUCIsIE1BQ19yYW5rTm9ybSA9ICJQIiwgTmV1dHJvcGhpbHNfcmFua05vcm0gPSAiUCIsIE1hc3RDZWxsc19yYW5rTm9ybSA9ICJQIiwgVmVzc2VsRGVuc2l0eV9yYW5rTm9ybSA9ICJQIikgJT4lICMjIGlkZW50aWZpZXJzOiBpbmRleCBmb3IgdGhlc2UgaXMgMSwgYW5kIGFsbCBiYXNlIHZhcmlhYmxlcyBoYXZlIDAgYXMgaWRlbnRpZmllcgogIHByaW50KCkKZGltKHNhbXBsZV9maWxlX2FlZ3MpCgpmd3JpdGUoc2FtcGxlX2ZpbGVfYWVncywKICAgICAgIGZpbGUgPSBwYXN0ZTAoU05QX2xvYywgIi8iLFRvZGF5LCIuIixQUk9KRUNUTkFNRSwiLkFFR1MxMjMuc2FtcGxlIiksCiAgICAgICBuYSA9ICJOQSIsIHNlcCA9ICJcdCIsIHF1b3RlID0gRkFMU0UsCiAgICAgICByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSwKICAgICAgIHNob3dQcm9ncmVzcyA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFKQoKcmVxdWlyZShEVCkKRFQ6OmRhdGF0YWJsZShzYW1wbGVfZmlsZV9hZWdzLCBjYXB0aW9uID0gIkFFR1M6IGZpbmFsIHNhbXBsZSBsaXN0IG9mIGdlbm90eXBlZCBBRSBwYXRpZW50cyBhZnRlciBxdWFsaXR5IGNvbnRyb2wuIiwgcm93bmFtZXMgPSBGQUxTRSkKCnJtKHRlbXAsIHRlbXAyLCB0ZW1wMykKYGBgCgojIyBYLWNocm9tb3NvbWUgZGF0YQoKVGhlIFgtY2hyb21vc29tZSBkYXRhIGlzIHRha2VuIGZyb20gcHJldmlvdXNseSBpbXB1dGVkIGRhdGEgYmFzZWQgb24gMTAwMEcgcGhhc2UgMyAodmVyc2lvbiA1KSBhbmQgR29OTDUuIEZvciBzb21lIHJlYXNvbiwgaW1wdXRpbmcgb24gdGhlIE1pY2hpZ2FuIEltcHV0YXRpb24gU2VydmVyIHdhcyBub3Qgc3VjY2Vzc2Z1bCAoKkFDVElPTiBwb2ludCopLgoKSGVyZSB3ZSBsb2FkIGluIHRoZSBzYW1wbGUgZmlsZXMgZm9yIHRoZSB0aHJlZSBkYXRhc2V0cyBvZiB0aGUgWCBjaHJvbW9zb21hbCBkYXRhLiBXZSBzaG91bGQ6CgotIGZpbHRlciBvdXQgc2FtcGxlcyB0aGF0IGRpZCBub3QgcGFzcyBxdWFsaXR5IGNvbnRyb2wsIGVuZGluZyB1cCB3aXRoIDIsMTI0IHNhbXBsZQotIHJlLW9yZGVyIHRoZSBkYXRhIHRvIGZpdCB0aGUgb3RoZXIgYXV0b3NvbWFsIGRhdGEuCgoKYGBge3IgU2FtcGxlTGlzdCBYfQoKQUVHUzEyM19jaHJYIDwtIGZyZWFkKHBhc3RlMChNSUNISU1QX2xvYywgIi9fY2hyMjNfMWtnX2dvbmw1L2FlZ3MucmF3LjFrZ19nb25sNS5jaHIyMy5tYXBwaW5ncy50eHQiKSkKbmFtZXMoQUVHUzEyM19jaHJYKVtuYW1lcyhBRUdTMTIzX2NoclgpID09ICJJRF8xIl0gPC0gIlNhbXBsZUlEX3Bvc3RJbXBDaHJYIgoKQUVHUzEyM19BbGxDaHIgPC0gbWVyZ2UoQUVHUzEyM19jaHJYLCBzYW1wbGVfZmlsZV9hZWdzLCBieS54ID0gIlNhbXBsZUlEX3Bvc3RNaWNoSW1wIiwgYnkueSA9ICJJRF8xIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGFsbC54ID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQgPSBGQUxTRSkKCm5hbWVzKEFFR1MxMjNfQWxsQ2hyKVtuYW1lcyhBRUdTMTIzX0FsbENocikgPT0gIklEXzIueSJdIDwtICJJRF8yIgpuYW1lcyhBRUdTMTIzX0FsbENocilbbmFtZXMoQUVHUzEyM19BbGxDaHIpID09ICJTVFVEWV9UWVBFLnkiXSA8LSAiU1RVRFlfVFlQRSIKbmFtZXMoQUVHUzEyM19BbGxDaHIpW25hbWVzKEFFR1MxMjNfQWxsQ2hyKSA9PSAiU2FtcGxlSURfcG9zdE1pY2hJbXAiXSA8LSAiSURfMSIKQUVHUzEyM19BbGxDaHIkbWlzc2luZy54IDwtIE5VTEwKQUVHUzEyM19BbGxDaHIkbWlzc2luZy55IDwtIE5VTEwKQUVHUzEyM19BbGxDaHIkU1RVRFlfVFlQRS54IDwtIE5VTEwKQUVHUzEyM19BbGxDaHIkSURfMi54IDwtIE5VTEwKCmRpbShBRUdTMTIzX0FsbENocikKc3RyKEFFR1MxMjNfQWxsQ2hyKQpgYGAKClRoaXMgc2VlbXMgZmluZSwgbGV0J3MgZmlsdGVyOyB3ZSBjYW4gdXNlIHRoaXMgZmlsZSB0byBmaWx0ZXIgdGhlIGdlbmV0aWMgZGF0YS4gQW5kIHdlIGNyZWF0ZSBhbm90aGVyIGZpbGUgdG8gcmUtb3JkZXIgdGhlIGRhdGEuCgpgYGB7ciBTYW1wbGVMaXN0IFg6IGZpbHRlcn0KCkFFR1MxMjNfQWxsQ2hyUUMgPC0gc3Vic2V0KEFFR1MxMjNfQWxsQ2hyLAogICAgICAgICAgICAgICAhaXMubmEoUUMyMDE4X0ZJTFRFUiksCiAgICAgICAgICAgICAgIHNlbGVjdCA9IGMoIklEXzEiLCAiSURfMiIsICJVUElEIiwgIlNUVURZX05VTUJFUiIsICJTYW1wbGVJRF9wb3N0SW1wQ2hyWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlFDMjAxOF9GSU5BTCIsICJRQzIwMThfRklMVEVSIiwgIlNFTEVDVElPTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkFFR1NfdHlwZSIsICJDSElQIiwgIlNUVURZX1RZUEUiLCAiU0FNUExFX1RZUEUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJQQzEiLCAiUEMyIiwgIlBDMyIsICJQQzQiLCAiUEM1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiUEM2IiwgIlBDNyIsICJQQzgiLCAiUEM5IiwgIlBDMTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJTZXgiLCAiQWdlIiwgIk9SeWVhciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICJDYWxjaWZpY2F0aW9uIiwgIkNvbGxhZ2VuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhdDEwIiwgIkZhdDQwIiwgIklQSCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICJTTUNfcmFua05vcm0iLCAiTUFDX3JhbmtOb3JtIiwgIk5ldXRyb3BoaWxzX3JhbmtOb3JtIiwgIk1hc3RDZWxsc19yYW5rTm9ybSIsICJWZXNzZWxEZW5zaXR5X3JhbmtOb3JtIikpCgpBRUdTMTIzX0FsbENoclFDX3Jlb3JkZXIgPC1BRUdTMTIzX0FsbENoclFDW29yZGVyKEFFR1MxMjNfQWxsQ2hyUUMkSURfMiksXSAjIHJlbWVtYmVyOiBJRF8yIGlzIHRoZSBvcmRlciBvZiBzYW1wbGVzCgpBRUdTMTIzX0FsbENoclFDX2ZpbHRlcmVkIDwtIHN1YnNldChBRUdTMTIzX0FsbENociwKICAgICAgICAgICAgICAgaXMubmEoUUMyMDE4X0ZJTFRFUiksCiAgICAgICAgICAgICAgIHNlbGVjdCA9IGMoIklEXzEiLCAiSURfMiIsICJVUElEIiwgIlNUVURZX05VTUJFUiIsICJTYW1wbGVJRF9wb3N0SW1wQ2hyWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlFDMjAxOF9GSU5BTCIsICJRQzIwMThfRklMVEVSIiwgIlNFTEVDVElPTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkFFR1NfdHlwZSIsICJDSElQIiwgIlNUVURZX1RZUEUiLCAiU0FNUExFX1RZUEUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJQQzEiLCAiUEMyIiwgIlBDMyIsICJQQzQiLCAiUEM1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiUEM2IiwgIlBDNyIsICJQQzgiLCAiUEM5IiwgIlBDMTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJTZXgiLCAiQWdlIiwgIk9SeWVhciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICJDYWxjaWZpY2F0aW9uIiwgIkNvbGxhZ2VuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhdDEwIiwgIkZhdDQwIiwgIklQSCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICJTTUNfcmFua05vcm0iLCAiTUFDX3JhbmtOb3JtIiwgIk5ldXRyb3BoaWxzX3JhbmtOb3JtIiwgIk1hc3RDZWxsc19yYW5rTm9ybSIsICJWZXNzZWxEZW5zaXR5X3JhbmtOb3JtIikpCgpmd3JpdGUoQUVHUzEyM19BbGxDaHJRQ19yZW9yZGVyLAogICAgICAgZmlsZSA9IHBhc3RlMChTTlBfbG9jLCAiLyIsVG9kYXksIi4iLFBST0pFQ1ROQU1FLCIuQUVHUzEyMy5jaHJYLnNhbXBsZSIpLAogICAgICAgbmEgPSAiTkEiLCBzZXAgPSAiXHQiLCBxdW90ZSA9IEZBTFNFLAogICAgICAgcm93Lm5hbWVzID0gRkFMU0UsIGNvbC5uYW1lcyA9IFRSVUUsCiAgICAgICBzaG93UHJvZ3Jlc3MgPSBUUlVFLCB2ZXJib3NlID0gVFJVRSkKCnJlcXVpcmUoRFQpCkRUOjpkYXRhdGFibGUoQUVHUzEyM19BbGxDaHJRQywgY2FwdGlvbiA9ICJBRUdTOiBmaW5hbCBzYW1wbGUgbGlzdCBvZiBnZW5vdHlwZWQgQUUgcGF0aWVudHMgYWZ0ZXIgcXVhbGl0eSBjb250cm9sIChjaHJvbW9zb21lIFgpLiIsIHJvd25hbWVzID0gRkFMU0UpCgoKYGBgCgojIEdXQVNUb29sS2l0IHByZXBhcmF0aW9uCgojIyBWYXJpYW50TGlzdHMKCkhlcmUgd2UgY3JlYXRlIGEgYHZhcmlhbnRsaXN0LnR4dGAgZmlsZSB1c2VkIGJ5ICoqR1dBU1Rvb2xLaXQqKiBmb3IgYW5hbHlzaXMuCgpgYGB7ciBjcmVhdGUgdmFyaWFudExpc3R9CnZhcmlhbnRfbGlzdAoKdGVtcCA8LSBzdWJzZXQodmFyaWFudF9saXN0LCBzZWxlY3QgPSBjKCJ2YXJpYW50aWQiLCAiY2hyIiwgInBvcyIpKQoKZndyaXRlKHRlbXAsCiAgICAgICBmaWxlID0gcGFzdGUwKFNOUF9sb2MsICIvdmFyaWFudGxpc3QudHh0IiksCiAgICAgICBuYSA9ICJOQSIsIHNlcCA9ICJcdCIsIHF1b3RlID0gRkFMU0UsCiAgICAgICByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gRkFMU0UsCiAgICAgICBzaG93UHJvZ3Jlc3MgPSBUUlVFLCB2ZXJib3NlID0gVFJVRSkKcm0odGVtcCkKYGBgCgojIyBDb3ZhcmlhdGVzCgpIZXJlIHdlIGNyZWF0ZSBhIGBjb3ZhcmlhdGVzLnR4dGAgZmlsZSB1c2VkIGJ5ICoqR1dBU1Rvb2xLaXQqKiBmb3IgYW5hbHlzaXMuCgpgYGB7ciBjcmVhdGUgY292YXJpYXRlc0xpc3R9CmxpYnJhcnkodGlkeXZlcnNlKQojIGZvciAnb3ZlcmFsbCcgYW5hbHlzZXMKYygiQWdlIFNleCBQQzEgUEMyIENISVAgT1J5ZWFyIikgJT4lIHdyaXRlX2xpbmVzKHBhc3RlMChTTlBfbG9jLCAiL2NvdmFyaWF0ZXMudHh0IikpCgojIGZvciBzZXgtc3BlY2lmaWMgYW5hbHlzZXMKYygiQWdlIFBDMSBQQzIgQ0hJUCBPUnllYXIiKSAlPiUgd3JpdGVfbGluZXMocGFzdGUwKFNOUF9sb2MsICIvY292YXJpYXRlcy5zZXgudHh0IikpCmBgYAoKIyMgUGhlbm90eXBlcwoKSGVyZSB3ZSBjcmVhdGUgYSBgcGhlbm90eXBlcy50eHRgIGZpbGUgdXNlZCBieSAqKkdXQVNUb29sS2l0KiogZm9yIGFuYWx5c2lzLgoKYGBge3IgY3JlYXRlIHBoZW5vdHlwZXNMaXN0fQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYygiQ2FsY2lmaWNhdGlvbiIsICJDb2xsYWdlbiIsICJGYXQxMCIsICJGYXQ0MCIsICJJUEgiLCAiU01DX3JhbmtOb3JtIiwgIk1BQ19yYW5rTm9ybSIsICJOZXV0cm9waGlsc19yYW5rTm9ybSIsICJNYXN0Q2VsbHNfcmFua05vcm0iLCAiVmVzc2VsRGVuc2l0eV9yYW5rTm9ybSIpICU+JSB3cml0ZV9saW5lcyhwYXN0ZTAoU05QX2xvYywgIi9waGVub3R5cGVzLnR4dCIpKQoKCmBgYAoKCiMgU2Vzc2lvbiBpbmZvcm1hdGlvbgoKLS0tLS0tCgogICAgVmVyc2lvbjogICAgICB2MS4wLjIKICAgIExhc3QgdXBkYXRlOiAgMjAyMC0wOS0xMgogICAgV3JpdHRlbiBieTogICBTYW5kZXIgVy4gdmFuIGRlciBMYWFuIChzLncudmFuZGVybGFhbi0yW2F0XXVtY3V0cmVjaHQubmwpLgogICAgRGVzY3JpcHRpb246ICBTY3JpcHQgdG8gZ2V0IHNvbWUgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBTdHVkeSBiYXNlbGluZSBjaGFyYWN0ZXJpc3RpY3MuCiAgICBNaW5pbXVtIHJlcXVpcmVtZW50czogUiB2ZXJzaW9uIDMuNC4zICgyMDE3LTA2LTMwKSAtLSAnU2luZ2xlIENhbmRsZScsIE1hYyBPUyBYIEVsIENhcGl0YW4KICAgIAogICAgQ2hhbmdlcyBsb2cKICAgICogdjEuMC4yIFVwZGF0ZWQgYmFzZWxpbmUgY2hhcmFjdGVyaXN0aWNzIGluZm9ybWF0aW9uLiBVcGRhdGUgR1dBU1Rvb2xLaXQgcHJlcGFyYXRpb24uIEFkZGVkIG1vcmUgY2FuZGlkYXRlIFNOUHMgdG8gbG9vayBhdC4gVXBkYXRlZCBzb21lIHZhcmlhYmxlIG5hbWVzLiAKICAgICogdjEuMC4xIEFkZCBhbiBhZGRpdGlvbmFsIHBoZW5vdHlwZS4KICAgICogdjEuMC4wIEluaXRpYWwgdmVyc2lvbi4gRml4ZWQgYmFzZWxpbmUgdGFibGUsIGFkZGVkIGNvZGVzLCBhbmQgcmVzdWx0cy4gQ3JlYXRlZCBzYW1wbGUtZmlsZXMuCgoKCi0tLS0tLQoKYGBge3IgZXZhbCA9IFRSVUV9CnNlc3Npb25JbmZvKCkKYGBgCgotLS0tLS0KPHN1cD4mY29weTsgMTk3OS0yMDIwIFNhbmRlciBXLiB2YW4gZGVyIExhYW4gfCBzLncudmFuZGVybGFhblthdF1nbWFpbC5jb20gfCBbc3d2YW5kZXJsYWFuLmdpdGh1Yi5pb10oaHR0cHM6Ly9zd3ZhbmRlcmxhYW4uZ2l0aHViLmlvKS48L3N1cD4KLS0tLS0tCgogIAogIAogIAoKCg==